当AsyncTasks运行时,处理屏幕方向更改

时间:2011-01-03 11:22:58

标签: android android-asynctask

我被这一段时间所困扰。如果我单独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实例中的方法。

3 个答案:

答案 0 :(得分:7)

我遇到了类似的问题并通过实现AsyncTask作为继承自Application类的类的一部分来解决它。应用程序的所有生命周期都可以使用Application类。因此,除非整个应用程序被终止,否则您不必担心AsyncTask被中断。

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

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

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

答案 1 :(得分:2)

答案 2 :(得分:0)

我已经提出了类似的问题here

基本上有一个example如何在设备轮换时暂停/恢复AsynTask。但是它仍然不适合所有情况(有时无法安全地暂停操作,例如在远程服务器上创建新用户)。对于那些“不安全”的情况,你需要编写一些我称之为棘手的“框架”。您将看到CommonsWare提供了github链接。