如何处理onPause()中的AsyncTask?

Mar*_*ark 8 android

我在我的活动中使用了AsyncTask.好像:

public class MyActivity {
    private AsyncTask mTask;

    private void doSomethingCool() {
        mTask = new AsyncTask(...);
        mTask.execute();
    }

    @Override
    protected void onPause() { 
        super.onPause();

        // How do I let the task keep running if just rotating?
        if (isFinishing() == false) {
            ... 
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

因此,如果用户正在旋转设备,onPause()将被调用,但我不想因此而取消任务.我知道有一种方法可以告诉系统实际上不会破坏我的旋转活动,但这是推荐用于此问题吗?我是否应该将AsyncTask放在一个不会绑定到Activity的静态全局类中?

谢谢

Eri*_*ill 5

这增加了丹尼尔的答案,但是比我评论中的字符更多.

通常情况下,当我使用AsyncTask时,我想要一个对话旋转,处理它是荒谬的.你必须做的事情非常像Daniel链接到的线程中的解决方案.

基本原则是,让Task对象保持对其父对象的显式引用.跨屏幕旋转保持Task对象(使用onRetainNonConfigurationInstance),然后在onCreate中,确保如果任务存在并且您来自屏幕旋转,请将Task的父活动设置为新实例.在任务内部,确保在显式父级上调用所有Activity方法.

您可以在此处看到我在基本ListActivity上执行此操作的示例:http://github.com/klondike/android-campfire/blob/master/src/com/github/klondike/android/campfire/RoomList.java

我做的一件事就是在那个例子中,我将尽可能多地将Task的onPostExecute移动到Activity上的一个方法中,只是出于代码清洁的原因.


Dan*_*Lew 4

在深入探讨 AsyncTask 和方向变化的乐趣之前,让我先问这个问题 - 您需要将 AsyncTask 保存在变量中吗?你需要这样做的原因并不多,因为 AsyncTask 内置了回调,所以你实际上不需要保留你的 AsyncTask (不要打电话给他,他会打电话给你)。此外,即使在方向更改期间,您的 AsyncTask 也应该继续运行 - 毕竟它在另一个线程中。

我唯一一次不得不保留 AsyncTask 是为了修复当 AsyncTask 运行时尝试显示对话框时出现的错误。有一个解决办法,但它非常令人讨厌。如果这是您遇到的具体问题,这里有很多相关讨论。

  • 好吧,既然如此,我*不需要*需要坚持下去。我在任务中通过网络运行登录功能。所以我只需要在完成时收到通知即可。我不明白如果用户销毁活动然后任务完成会发生什么 - 它会“回调”什么?它还会尝试接触现在已被破坏的活动吗? (6认同)