我被这一段时间所困扰。如果我单独Thread
/ AsyncTask
正在运行,如何正确处理屏幕方向更改?目前,我有
android:configChanges="orientation|keyboard|keyboardHidden"
在我的AndroidManifest.xml
中,但那是not really encouraged:
注意:应避免使用此属性,并仅将其用作最后手段。有关如何通过配置更改正确处理重新启动的更多信息,请阅读处理运行时更改。
此外,在 2.3模拟器中,切换到landscape
时可以正常工作,但切换回portrait
会失败。
现在,我使用configChanges
的原因是因为当用户切换方向时,我可能会运行AsyncTask
,执行一些网络流量,而且我不希望它停止。
有没有其他方法可以做到这一点,还是有办法修复2.3切换回肖像?
我知道onRetainNonConfigurationInstance
,但我不确定“保存”AsyncTask
实例是个好主意,主要是因为扩展AsyncTask
的类不是静态的(因此它与Activity
绑定 - 并且它必须是,因为在onPostExecute()
中它调用Activity
实例中的方法。
答案 0 :(得分:7)
我遇到了类似的问题并通过实现AsyncTask
作为继承自Application
类的类的一部分来解决它。应用程序的所有生命周期都可以使用Application
类。因此,除非整个应用程序被终止,否则您不必担心AsyncTask
被中断。
要在任务完成时收到通知,Activity
必须实现一个接口,用于将自己注册到Application
类。
当您的应用程序因屏幕旋转而被销毁时,您可以从Activity
类取消注册Application
并在重新创建时重新注册它。如果任务在销毁和重新创建之间完成,则操作的结果可以同时存储在Application
类中,以便Activity
可以检查任务是否仍在运行,或者结果是否已经可用重建。
另一个优点是您可以直接访问应用程序上下文,因为Application
类是Context
类的子类。
答案 1 :(得分:2)
看看droid-fu库BetterAsyncTask
。它旨在处理这种确切的情况。
答案 2 :(得分:0)