如何在android中停止asynctask线程?

use*_*ser 55 android android-asynctask

我想AsyncTask从另一个AsyncTask线程中停止一个线程.我试图 new AsyncTask.cancel(true)阻止后台进程,但它没有停止.

有人可以帮我吗?

Yas*_*mar 105

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

private YourAsyncTask mTask;
Run Code Online (Sandbox Code Playgroud)

像这样实例化它:

mTask = new YourAsyncTask().execute();
Run Code Online (Sandbox Code Playgroud)

像这样杀死/取消它:

mTask.cancel(true);
Run Code Online (Sandbox Code Playgroud)

  • 但是,有点烦人的是,如果你有一个单一的操作(比如数据库查询),你就不能真正取消.如果查询需要很长时间并且只是一个调用,那么似乎没有办法取消它:/ (5认同)
  • 在使用这样的之后你的AsAsynchTask mTask = new YourAsncTask(); mTask.execute(); 工作.不错. (4认同)
  • 如果您在 AsyncTask 中(在循环中)执行某些操作,那么您可能需要检查 isCancelled() - 请参阅 /sf/ask/761778041/ android 中的异步任务 (2认同)

Dec*_*ome 20

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

if(!isCancelled()){
// Do your stuff
}
Run Code Online (Sandbox Code Playgroud)

所以基本上,如果线程没有被取消,那就去做吧,否则跳过它:)在你的操作过程中检查这个问题可能会有用,特别是在服用时间之前.

此外,"清理"可能也很有用

onCancelled();
Run Code Online (Sandbox Code Playgroud)

AsyncTask的文档:

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

希望这可以帮助!


Pra*_*ani 12

您也可以在使用它onPauseonDestroyActivity生命周期:

//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);
Run Code Online (Sandbox Code Playgroud)

在哪里loginTask是你的对象AsyncTask

谢谢.


use*_*776 6

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

task.cancel(true);
Run Code Online (Sandbox Code Playgroud)

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

isCancelled()
Run Code Online (Sandbox Code Playgroud)

如果是,则手动停止执行.