对于在另一个线程中运行复杂任务来说,AsyncTask是一件很棒的事情.

但是,当在AsyncTask仍在运行的同时存在方向改变或另一配置改变时,电流Activity被 destruct 并重新启动.当AsyncTask的实例连接到该活动时,它会失败并导致"强制关闭"消息窗口.

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

到目前为止,我看到的是:

  • 禁用方向更改.(当然不是你应该处理的方式.)
  • 让任务存活下来,并通过onRetainNonConfigurationInstance使用新的活动实例对其进行更新
  • 只需在销毁Activity时取消任务,并在重新创建Activity时重新启动它.
  • 将任务绑定到应用程序类而不是活动实例.
  • "Shelfs"项目中使用的一些方法(通过onRestoreInstanceState)

一些代码示例:

Android AsyncTasks during a screen rotation, Part IPart II

ShelvesActivity.java

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

推荐答案

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

也不要用Activity#onRetainNonConfigurationInstance().它的模块化程度较低,不太适合基于Fragment的应用程序.

您可以使用read my article描述如何使用保留的Fragment处理配置更改.它很好地解决了在旋转变化期间保持AsyncTask的问题.基本上,您需要将AsyncTask托管在Fragment中,在Fragment上呼叫setRetainInstance(true),然后通过保留的FragmentActivity报告AsyncTask的进度/结果.

Android相关问答推荐

列表的可变状态未正确更新

房间打开创建回调java.nio.channels. OverlappingFilLockResponse

以编程方式更改Android应用程序上的文件许可

在Android的Whatsapp中共享多个图片和文本

Android意图过滤器不限制应用程序仅处理YouTube链接

Kotlin DSL:为什么我可以从Play Store获取发布版本的日志(log)?

如何使可拖动内容停留在可组合框的边界内

属性可选的涟漪效果ItemBackEarth Borderless不适用于Android 13和更高版本

在一列中垂直对齐两个框

是否可以附加事件处理程序,如onClick,拖动到Canvas Composable中绘制的内容,或使用drawBehind修饰符?

Play store 的 Play 完整性与 Firebase 应用判断 Play 完整性

Jetpack Compose:如何绘制异形边框?

Android 模拟器 Wifi 连接没有互联网

Material 3 中的 ModalBottomSheet 用于 compose

如何添加到先前预填充的 Room 数据库?

我该怎么做文本计时器

LazyColumn 单选中的状态提升. Jetpack compose

如何根据加载图像的 colored颜色 绘制边框?

如何从构建的流对象中发出值

Android TTS 在屏幕关闭一段时间后停止朗读