如何在 Activity 取消时退出所有异步任务?

3
根据下面的帖子:http://techtej.blogspot.com.es/2011/03/android-thread-constructspart-4.html。它说:
在这种情况下,如果您的应用程序没有关闭,但是任何前台任务已关闭或更改,则所有后台任务都需要知道此情况并尝试优雅地退出。
为了实现这一点,我正在调用所有AsyncTask实例上的cancel函数。这样做正确吗?有时在图像延迟加载中,我不跟踪所有仍在运行(获取图像)的AsyncTask,那么如何告诉Android OS也取消它们?

1
使用Android通用图像加载器(UIL)Picasso进行延迟加载。个人而言,我使用UIL,它是一个很棒的库。 - Sufian
1
关于如何取消AsyncTask有很多问题,答案是你必须定期检查(在doInBackground()内部)任务是否被取消(如果isCancelled()为真,则取消/中止正在进行的操作)。 - Sufian
可能是Android - 强制取消AsyncTask的重复问题。 - Sufian
2个回答

2
你可以通过检查线程(AsyncTask)对象的状态来取消AsyncTask
private Example ex = new Example();

class Example AsyncTask<Object, Void, Void> {
    @Override
    protected Void doInBackground(Object... params) {
        String result = null;
        if(!isCancelled())
            result = getHttpRestManager().send();
        if(!isCancelled())  {
            // some codes
        }
        ...
        return null;
    }
}

public boolean cancel() {
    switch(ex.getStatus())  {
    case RUNNING:
    case PENDING:
        return ex.cancel(true);
    case FINISHED:
        return false;
    }
    return false;
}

取消线程后,其状态始终返回 RUNNINGFINISHED。如果状态不为 PENDING,则无法执行线程。因此,在每次 .execute() 之前,您必须像这样初始化新的线程对象: ex = new Example()

1

如果你不想返回到另一个活动,那么你可以使用

System.exit(0);

但如果堆栈中有其他活动,则必须检查 // AsyncTask private Example ex = new Example();

在onDestroy方法中,您可以检查它是否正在运行

if(ex.getStatus() == AsyncTask.Status.PENDING){

}

如果(ex.getStatus() == AsyncTask.Status.RUNNING){

}

如果(ex.getStatus() == AsyncTask.Status.FINISHED) {

}


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