最佳实践:方向变更期间的AsyncTask

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (14)

AsyncTask在另一个线程中运行复杂任务是一件很棒的事情。

但是,当有方向更改或其他配置更改时,AsyncTask仍在运行,当前Activity被摧毁并重新启动。作为实例AsyncTask连接到该活动时,它将失败,并导致“强制关闭”消息窗口。

因此,我正在寻找某种“最佳实践”,以避免这些错误和防止AsyncTask失败。

到目前为止我看到的是:

  • 禁用方向更改。(当然不是您应该如何处理这个问题。)
  • 让任务存活,并通过以下方法使用新的活动实例更新任务:onRetainNonConfigurationInstance
  • Activity将被销毁,并在Activity再次创建。
  • 将任务绑定到应用程序类,而不是活动实例。
  • “货架”项目中使用的一些方法(通过onRestoreInstanceState)

你能帮我找到解决问题的最佳方法吗?代码本身也很重要,因为我不知道如何正确地解决这个问题。

提问于
用户回答回答于

不使用android:configChanges来解决这个问题。这是很糟糕的做法。

不使用Activity#onRetainNonConfigurationInstance(),不那么模块化,也不适合Fragment-基于申请。

FragmentS,它解决了保留AsyncTask在旋转过程中变化很好。你基本上需要主持你的AsyncTask在一个Fragment,打电话setRetainInstance(true)Fragment,并报告AsyncTask进展/结果回到Activity通过保留Fragment.

用户回答回答于

我通常通过在.onPostExecute()回调中使用AsyncTask火广播意图来解决这个问题,这样它们就不会直接修改启动它们的活动。这些活动使用动态广播收发器收听这些广播,并采取相应行动。

这样,AsyncTask就不必关心处理其结果的特定活动实例。当他们完成任务时,他们只会“喊”,如果某个活动在那个时候(活动和集中/处于恢复状态),并且对任务的结果感兴趣,那么它就会被处理。

这涉及到更多的开销,因为运行时需要处理广播,但我通常并不介意。我认为使用LocalBroadCastManager而不是默认的系统Wide可以加快速度。

扫码关注云+社区