如何在android中停止asynctask线程?

时间:2011-10-19 12:26:47

标签: android android-asynctask

我想从另一个AsyncTask帖子中停止AsyncTask个帖子。我试过像 new AsyncTask.cancel(true)停止后台流程,但没有停止。

有人可以帮我吗?

6 个答案:

答案 0 :(得分:100)

在您的活动中声明您的asyncTask:

private YourAsyncTask mTask;

像这样实例化:

mTask = new YourAsyncTask().execute();

像这样杀死/取消它:

mTask.cancel(true);

答案 1 :(得分:20)

事情没有停止的原因是因为进程(doInBackground())一直运行直到它完成。因此,在执行操作之前,您应该检查线程是否被取消:

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

所以基本上,如果没有取消线程,那就去做吧,否则跳过它:) 在您的手术过程中,尤其是在服用时间之前,可能会对此进行一些检查。

中“清理”alittle可能也很有用
onCancelled();

AsyncTask的文档:

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

希望这有帮助!

答案 2 :(得分:12)

您可能还必须在onPause生命周期的onDestroyActivity中使用它:

//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);

其中loginTaskAsyncTask

的对象

谢谢。

答案 3 :(得分:6)

你不能立即杀死asynctask。为了停止你应该先取消它:

task.cancel(true);

而不是asynctask的 doInBackground()方法检查它是否已被取消:

isCancelled()

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

答案 4 :(得分:0)

我遇到了类似的问题 - 基本上我在用户销毁片段后在异步任务中获得NPE。在研究Stack Overflow上的问题之后,我采用了以下解决方案:

volatile boolean running;

public void onActivityCreated (Bundle savedInstanceState) {

    super.onActivityCreated(savedInstanceState);

    running=true;
    ...
    }


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

    running=false;
    ...
}

然后,我在异步代码中定期检查“是否正在运行”。我有压力测试这个,我现在无法“打破”我的活动。这非常有效,并且比我在SO上看到的一些解决方案更简单。

答案 5 :(得分:-4)

你可以一次检查onCancelled():

protected Object doInBackground(Object ... x){

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

}