如何在安卓中停止异步任务线程?

60

我想要从另一个 AsyncTask 线程中停止一个 AsyncTask 线程。我已经尝试过使用 new AsyncTask.cancel(true) 来停止后台进程,但它没有停止。

有人可以帮我解决这个问题吗?

6个回答

114

在你的 Activity 中声明你的 asyncTask:

private YourAsyncTask mTask;

像这样实例化它:

mTask = new YourAsyncTask().execute();
像这样终止/取消它:
mTask.cancel(true);

4
使用这样的方式后,YourAsynchTask mTask=new YourAsncTask(); mTask.execute(); 起作用了。不错。 - Senthil
5
有时候挺烦人的,如果你在执行单个操作(比如数据库查询),就无法真正取消它。如果查询需要很长时间而且只是一个调用,那么似乎没有办法取消它 :/ - AgentKnopf
2
如果您正在AsyncTask中执行某些操作(在循环内),则可能需要检查isCancelled() - 参见https://dev59.com/r2gv5IYBdhLWcg3wCsg8 - amar

22

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

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

这就是说,如果线程没有被取消,那么就执行它,否则跳过它 :) 在操作期间检查这个有时会很有用,尤其是在进行耗时的操作之前。

同时,在某些情况下,“清理”一下也可能很有用。

onCancelled();

AsyncTask的文档:

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

希望这能帮到您!


如果您将true作为参数传递,那么它将停止后台任务,因此只有在task.cancel(boolean)中传递false时才有帮助。 - Dylan Vander Berg
@DylanVanderBerg 这并不完全正确。如果你的代码不是严格按照线性方式设计的话,了解这一点是非常有帮助的。虽然你可能不会在 doInBackground 中检查 isCancelled,但它并不仅在那里有效,而 onCancelled 可能是平稳操作和内存错误之间的关键差异。 - Abandoned Cart

12

您可能还需要在Activity生命周期的onPauseonDestroy方法中使用它:

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

7

你不能立即终止asynctask。为了停止它,您应该首先取消它:

task.cancel(true);

然后在AsyncTask的doInBackground()方法中检查是否已经取消:

isCancelled()

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


1

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

volatile boolean running;

public void onActivityCreated (Bundle savedInstanceState) {

    super.onActivityCreated(savedInstanceState);

    running=true;
    ...
    }


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

    running=false;
    ...
}

然后,在我的异步代码中,我会定期检查“是否正在运行”。我进行了压力测试,现在无法“破坏”我的活动。这很完美,比我在SO上看到的一些解决方案更简单。


-3

你可以在onCancelled()中检查一次:

protected Object doInBackground(Object... x) {

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

}


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接