android - 运行 AsyncTask 时处理屏幕方向更改

标签 android android-asynctask

我已经被这个问题困扰了一段时间。当我有一个单独的 Thread/AsyncTask 运行时,如何正确处理屏幕方向的变化?目前,我有

android:configChanges="orientation|keyboard|keyboardHidden"

在我的 AndroidManifest.xml 中,但那是 not really encouraged :

Note: Using this attribute should be avoided and used only as a last-resort. Please read Handling Runtime Changes for more information about how to properly handle a restart due to a configuration change.

另外,在 2.3 模拟器中,切换到 landscape 时它可以工作,但切换回 portrait 会失败。

现在,我使用 configChanges 的原因是因为当用户切换方向时,我可能有一个 AsyncTask 正在运行,处理一些网络流量,而我没有希望它停止。

有没有其他方法可以做到这一点,或者有没有办法修复 2.3 以切换回纵向?

我知道 onRetainNonConfigurationInstance,但我不确定“保存”AsyncTask 实例是否是个好主意,主要是因为扩展了 的类>AsyncTask 不是静态的(因此它与 Activity 相关联)——它必须是静态的,因为在 onPostExecute() 中它调用来自Activity 实例。

最佳答案

我遇到了与您类似的问题,并通过将 AsyncTask 作为继承自 Application 的类的一部分来解决它。类(class)。 Application 类在应用程序的整个生命周期中都可用,因此您不必担心您的 AsyncTask 会被中断,除非整个应用程序将被终止。

要在任务完成时得到通知,Activity 必须实现一个接口(interface),用于将自身注册到 Application 类。

当您的应用程序因屏幕旋转而被销毁时,您可以从 Application 类中注销您的 Activity,并在重新创建时重新注册它。如果任务在销毁和重新创建之间完成,则操作的结果可以同时存储在 Application 类中,以便 Activity 可以检查任务是否仍在运行或结果是否重新创建时已经可用。

另一个优点是您可以直接访问应用程序上下文,因为 Application 类是 Context 类的子类。

关于android - 运行 AsyncTask 时处理屏幕方向更改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4584015/

相关文章:

java - 在android中解析asynctask内的json

android - 如何在 Android 中正确终止 AsyncTack 线程?

java - 从 AsyncTask 返回位图文件会卡住 UI 线程

java - android 获取用户当前位置

android - Dagger 2 范围问题,定义子 fragment 模块。结果 : binding is not resolved for interface

谷歌云存储的 Android 示例

android - 如何在 chrome 应用程序中使用自动完成功能?

android - Kotlin Android View 绑定(bind) : findViewById vs Butterknife vs Kotlin Android Extension

java - 如何为此 REST 响应编写 getter setter 类以进行改造

java - Android、java - 无法从 asynctask 更新变量