我想要从另一个 AsyncTask
线程中停止一个 AsyncTask
线程。我已经尝试过使用 new AsyncTask.cancel(true)
来停止后台进程,但它没有停止。
有人可以帮我解决这个问题吗?
我想要从另一个 AsyncTask
线程中停止一个 AsyncTask
线程。我已经尝试过使用 new AsyncTask.cancel(true)
来停止后台进程,但它没有停止。
有人可以帮我解决这个问题吗?
在你的 Activity 中声明你的 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)
中传递false时才有帮助。 - Dylan Vander BergdoInBackground
中检查 isCancelled
,但它并不仅在那里有效,而 onCancelled
可能是平稳操作和内存错误之间的关键差异。 - Abandoned Cart您可能还需要在Activity
生命周期的onPause
或onDestroy
方法中使用它:
//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()中检查一次:
protected Object doInBackground(Object... x) {
while (/* condition */) {
if (isCancelled()) break;
}
return null;
}