2011-10-19 90 views

回答

87

声明你的AsyncTask您的活动:

private YourAsyncTask mTask; 

实例化它是这样的:

mTask = new YourAsyncTask().execute(); 

杀/取消这样的:

mTask.cancel(true); 
+2

使用像这样YourAsynchTask mTask = new YourAsncTask(); mTask.execute();工作。不错。 – Senthil

+3

虽然这很麻烦,但是如果你有一个单一的操作(比如数据库查询),你真的不能取消。如果查询需要很长时间并且只是一个调用,那么看起来没有办法取消它:/ – AgentKnopf

+0

如果您在AsyncTask内部(在一个循环中)执行某些操作,那么您可能需要检查isCancelled() - 参考https://stackoverflow.com/questions/10882543/how-to-completly-kill-remove-delete-stop-an-asynctask-in-android – amar

21

事情没有停止的原因是因为进程(doInBackground())运行直到完成。因此,你应该检查,如果线程被取消或没有做的东西之前:

if(!isCancelled()){ 
// Do your stuff 
} 

所以基本上,如果线程没有被取消,这样做,否则跳过吧:) 可能是有用的检查此有时在你的手术过程中,特别是在时间耗尽之前。

而且它可能是 “清理” 小有一点有用的

onCancelled(); 

的文档的AsyncTask:

http://developer.android.com/reference/android/os/AsyncTask.html

希望这有助于!

+0

如果你传递true作为参数,那么它将停止在后台任务,所以这只有在你将false传入'task.cancel(布尔)' –

1

我有一个类似的问题 - 基本上我是在用户销毁碎片后在异步任务中获得NPE。研究对堆栈溢出问题后,我采取了以下解决方案:

volatile boolean running; 

public void onActivityCreated (Bundle savedInstanceState) { 

    super.onActivityCreated(savedInstanceState); 

    running=true; 
    ... 
    } 


public void onDestroy() { 
    super.onDestroy(); 

    running=false; 
    ... 
} 

然后,我检查“是否运行”定期在我的异步代码。我有压力测试了这一点,现在我无法“打破”我的活动。这完美地工作,并且比我在SO上看到的一些解决方案更简单。

6

你不能立即杀死asynctask。为了它阻止你应该首先将其取消:

task.cancel(true); 

,比的AsyncTask的doInBackground()方法检查它是否已经取消:

isCancelled() 

,如果是,手动停止执行它。

-4

ü可以检查onCancelled()一次,然后:

保护对象doInBackground(对象...X){

while (/* condition */) { 
    if (isCancelled()) break; 
} 
return null; 

}

+0

时才有用。这不是关于从另一个线程取消AsyncTask。 – QMaster

9

您也可以在或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

感谢对象您。

+0

我到这里就是为了这个! – winklerrr