我在我的活动中使用了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的静态全局类中?
谢谢
这增加了丹尼尔的答案,但是比我评论中的字符更多.
通常情况下,当我使用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上的一个方法中,只是出于代码清洁的原因.
在深入探讨 AsyncTask 和方向变化的乐趣之前,让我先问这个问题 - 您需要将 AsyncTask 保存在变量中吗?你需要这样做的原因并不多,因为 AsyncTask 内置了回调,所以你实际上不需要保留你的 AsyncTask (不要打电话给他,他会打电话给你)。此外,即使在方向更改期间,您的 AsyncTask 也应该继续运行 - 毕竟它在另一个线程中。
我唯一一次不得不保留 AsyncTask 是为了修复当 AsyncTask 运行时尝试显示对话框时出现的错误。有一个解决办法,但它非常令人讨厌。如果这是您遇到的具体问题,这里有很多相关讨论。
| 归档时间: |
|
| 查看次数: |
12915 次 |
| 最近记录: |