android - 最佳实践 : AsyncTask during orientation change

标签 android multithreading exception

AsyncTask 是在另一个线程中运行复杂任务的好东西。

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

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

到目前为止我看到的是:

  • 禁用方向更改。(肯定不是你应该处理的方式。)
  • 让任务存活并通过 onRetainNonConfigurationInstance
  • 用新的 Activity 实例更新它
  • Activity 销毁时取消任务,Activity 再次创建时重新启动。
  • 将任务绑定(bind)到应用程序类而不是 Activity 实例。
  • “货架”项目中使用的一些方法(通过 onRestoreInstanceState)

一些代码示例:

Android AsyncTasks during a screen rotation, Part IPart II

ShelvesActivity.java

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

最佳答案

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

不要使用Activity#onRetainNonConfigurationInstance()。这不是模块化的,不适合基于 Fragment 的应用程序。

您可以read my article描述如何使用保留的 Fragment 处理配置更改。它很好地解决了在旋转更改中保留 AsyncTask 的问题。您基本上需要在 Fragment 中托管您的 AsyncTask,在 Fragment 上调用 setRetainInstance(true),然后报告AsyncTask 的进度/结果通过保留的 Fragment 回到它的 Activity

关于android - 最佳实践 : AsyncTask during orientation change,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7128670/

相关文章:

java - 从 2000 行文件中提取数据的 Java XML 解析器(在移动设备上)

android - Apache Commons 网络 API 无法在 Android ICS(4.0) 上运行

android - 无法在 Android(在 MarshMallow 及更高版本)设备中创建目录

c# - 为什么推荐继承Exception而不是ApplicationException

WCF 停止的 Windows 服务

c# - 永不捕获的异常

android - 新的 Android Geofence Api - 示例代码在位置时不发出警报/通知

c# 我是否正确处理多个线程

multithreading - 为什么 bool 值需要是原子的?

java - Java 中的线程数是否有硬性限制?