【发布时间】:2011-12-10 21:35:56
【问题描述】:
我想从另一个 AsyncTask 线程中停止一个 AsyncTask 线程。我试过像
new AsyncTask.cancel(true) 停止后台进程但它没有停止。
谁能帮我解决这个问题?
【问题讨论】:
我想从另一个 AsyncTask 线程中停止一个 AsyncTask 线程。我试过像
new AsyncTask.cancel(true) 停止后台进程但它没有停止。
谁能帮我解决这个问题?
【问题讨论】:
在您的活动中声明您的 asyncTask:
private YourAsyncTask mTask;
像这样实例化它:
mTask = new YourAsyncTask().execute();
像这样杀死/取消它:
mTask.cancel(true);
【讨论】:
事情没有停止的原因是进程 (doInBackground()) 一直运行到完成。因此,您应该在执行操作之前检查线程是否被取消:
if(!isCancelled()){
// Do your stuff
}
所以基本上,如果线程没有被取消,就去做,否则跳过它:) 在您的操作过程中检查这些可能很有用,尤其是在花费时间之前。
另外,“清理”一点也很有用
onCancelled();
AsyncTask 的文档:
http://developer.android.com/reference/android/os/AsyncTask.html
希望这会有所帮助!
【讨论】:
task.cancel(boolean) 时才会有帮助
doInBackground 中检查isCancelled,但这并不是唯一有效的地方,onCancelled 可能是平稳运行和内存错误之间的区别。
您可能还必须在onPause 或onDestroy 的Activity 生命周期中使用它:
//you may call the cancel() method but if it is not handled in doInBackground() method
if (loginTask != null && loginTask.getStatus() != AsyncTask.Status.FINISHED)
loginTask.cancel(true);
loginTask 是 AsyncTask 的对象
谢谢。
【讨论】:
你不能立即杀死 asynctask。为了让它停止,你应该先取消它:
task.cancel(true);
然后在 asynctask 的 doInBackground() 方法中检查它是否已经被取消:
isCancelled()
如果是,请停止手动执行。
【讨论】:
我遇到了类似的问题 - 本质上,在用户销毁片段后,我在异步任务中获得了 NPE。在 Stack Overflow 上研究了这个问题后,我采用了以下解决方案:
volatile boolean running;
public void onActivityCreated (Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
running=true;
...
}
public void onDestroy() {
super.onDestroy();
running=false;
...
}
然后,我会定期在我的异步代码中检查“是否正在运行”。我已经对此进行了压力测试,现在我无法“破坏”我的活动。这完美地工作并且具有比我在 SO 上看到的一些解决方案更简单的优点。
【讨论】:
你可以检查一次 onCancelled() :
受保护的对象 doInBackground(Object... x) {
while (/* condition */) {
if (isCancelled()) break;
}
return null;
}
【讨论】: