【问题标题】:Handle screen orientation changes when there are AsyncTasks running运行 AsyncTask 时处理屏幕方向更改
【发布时间】:2011-01-03 11:22:57
【问题描述】:

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

【问题讨论】:

    标签: android android-asynctask


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 非常好,比实现 Service 简单得多。谢谢。
    • @Flo 我知道自从发布帖子以来已经有一段时间了,但我正在尝试做同样的事情,但我不太明白你的意思是“在任务完成活动时收到通知”必须实现一个接口,用于将自身注册到 Application 类。”有机会举个例子吗? (我是 java 和 android1 的新手)
    • 抱歉,我没有代码示例。但是看看the observer pattern 我希望你能理解我所说的“注册”(update())和“通知”(addObserver())的意思。
    • 啊,在我之前的评论中,我混淆了一些东西。 “注册”表示调用 addObserver() 方法,“通知”表示调用 update()。
    【解决方案2】:

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 因此,在重新启动 Activity 时,无法(简单)保持 AsyncTask 运行。真可惜。但是,我发现不切换回纵向是一个模拟器问题,因为设置应用程序做同样的事情。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多