我想停止另一个AsyncTask
线程的AsyncTask
线程。我尝试过像 new AsyncTask.cancel(true)
来停止后台进程,但并没有停止。如何在android中停止asynctask线程?
任何人都可以帮助我吗?
我想停止另一个AsyncTask
线程的AsyncTask
线程。我尝试过像 new AsyncTask.cancel(true)
来停止后台进程,但并没有停止。如何在android中停止asynctask线程?
任何人都可以帮助我吗?
声明你的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
希望这有助于!
如果你传递true作为参数,那么它将停止在后台任务,所以这只有在你将false传入'task.cancel(布尔)' –
我有一个类似的问题 - 基本上我是在用户销毁碎片后在异步任务中获得NPE。研究对堆栈溢出问题后,我采取了以下解决方案:
volatile boolean running;
public void onActivityCreated (Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
running=true;
...
}
public void onDestroy() {
super.onDestroy();
running=false;
...
}
然后,我检查“是否运行”定期在我的异步代码。我有压力测试了这一点,现在我无法“打破”我的活动。这完美地工作,并且比我在SO上看到的一些解决方案更简单。
你不能立即杀死asynctask。为了它阻止你应该首先将其取消:
task.cancel(true);
,比的AsyncTask的doInBackground()方法检查它是否已经取消:
isCancelled()
,如果是,手动停止执行它。
ü可以检查onCancelled()一次,然后:
保护对象doInBackground(对象...X){
while (/* condition */) {
if (isCancelled()) break;
}
return null;
}
时才有用。这不是关于从另一个线程取消AsyncTask。 – QMaster
您也可以在或Activity
生命周期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
感谢对象您。
我到这里就是为了这个! – winklerrr
使用像这样YourAsynchTask mTask = new YourAsncTask(); mTask.execute();工作。不错。 – Senthil
虽然这很麻烦,但是如果你有一个单一的操作(比如数据库查询),你真的不能取消。如果查询需要很长时间并且只是一个调用,那么看起来没有办法取消它:/ – AgentKnopf
如果您在AsyncTask内部(在一个循环中)执行某些操作,那么您可能需要检查isCancelled() - 参考https://stackoverflow.com/questions/10882543/how-to-completly-kill-remove-delete-stop-an-asynctask-in-android – amar