繁体   English   中英

如何在Android中停止asynctask线程?

[英]How to stop asynctask thread in android?

我想停止AsyncTask从另一个线程AsyncTask线程。 我已经尝试过像new AsyncTask.cancel(true)停止后台进程,但是没有停止。

有人可以帮我吗?

在活动中声明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

希望这可以帮助!

您可能还必须在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对象

谢谢。

您不能只是立即杀死asynctask。 为了停止它,您应该首先取消它:

task.cancel(true);

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

isCancelled()

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

我有一个类似的问题-从本质上讲,在用户销毁了片段之后,我在异步任务中得到了NPE。 在研究了堆栈溢出问题之后,我采用了以下解决方案:

volatile boolean running;

public void onActivityCreated (Bundle savedInstanceState) {

    super.onActivityCreated(savedInstanceState);

    running=true;
    ...
    }


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

    running=false;
    ...
}

然后,我在异步代码中定期检查“是否正在运行”。 我对此进行了压力测试,现在无法“中断”我的活动。 与我在SO上看到的一些解决方案相比,这完美地工作并且具有简化的优点。

您可以一次检查onCancelled():

受保护的对象doInBackground(Object ... x){

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

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM