我已经被这个问题困扰了一段时间。当我有一个单独的 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/