如何在android中取消asynctask



我正在我的应用程序的UI部分运行一些任务。

在做这个冗长的任务时,我需要显示进度对话框,所以我使用AsysnTask来执行这个。

当用户按下后退键时,进度条正在运行,我需要取消进度条,我需要暂停正在进行的后台工作。

我在进度对话框中调用了"解散()",所以它被解散了。

我在我的AsysnTask对象上调用"cancel(true)",我认为我的后台操作停止了,但它仍然在执行,尽管我调用了"cancel(true)"。

然后我对这个问题做了一些搜索,并了解到"cancel(true)"只调用AsyncTask的"onCancelled()"方法。

我不知道我必须在我的onCancelled()方法中写什么,以便我的后台操作立即停止。

我的doInBackground()方法是这样的

      protected void doInBackground()
         {
                  Statement  1;
                  Statement  2;
                 Statement  3;
                 Statement  4;
                 Statement  5;
                 Statement  6;
                 Statement  6;
                 Statement  7;
                 Statement  8;
                 Statement  9;
          }

让我们在上面的代码中说,如果在"语句4"之后收到取消请求,那么我不想执行reaming语句。

上面的"doInBackground()"只是一个例子,使其易于理解,在实际中,我的"doInBackground()"方法将有100的语句,我无法预测何时可以得到取消操作的请求。

请告诉我怎么做。

在java中,线程永远不会过早终止。你可以使用本机API杀死线程,但是Java API不再允许这样做了(即使有一些函数暴露了这个接口,但它们没有实现,只是抛出异常)。

Android也暴露了同样的原理,线程不能被终止。作为开发人员,你有责任以这样的方式编写一个线程,所以当它被取消时,它会正确地反应。

在你的情况下,你需要实现doInBackground(),所以它检查线程是否已经被取消。例如:

protected Void doInBackground()
{
       if(isCancelled()) return null;
       Statement  1;
       Statement  2;
       if(isCancelled()) return null;
       Statement  3;
       if(isCancelled()) return null;
       Statement  9;
 }

这只是一个例子,你可以做一个更好的实现,在执行下一个垃圾任务之前检查线程状态。

顺便说一下,isCancelled()是专门为这种用例设计的。从文档:

public final boolean isCancelled ()

返回true,如果此任务在正常完成之前被取消。如果您正在对任务调用cancel(boolean),则返回的值此方法应定期从doInBackground(Object[])来尽快结束任务

AsyncTasks有两个重要的方法:cancel()isCancelled()

doInBackground()的某个地方,您应该检查isCancelled()的值,如果它返回true,则完成执行。与正常执行的一个重要区别是,一旦doInBackground()返回,在UI线程上调用onCancelled(),而不是onPostExecute()

一个例子,文档中简单任务的修改版本:

private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> {
     protected Long doInBackground(URL... urls) {
         int count = urls.length;
         long totalSize = 0;
         for (int i = 0; i < count && !isCancelled(); i++) {
             totalSize += Downloader.downloadFile(urls[i]);
             publishProgress((int) ((i / (float) count) * 100));
         }
         return totalSize;
     }
     protected void onProgressUpdate(Integer... progress) {
         setProgressPercent(progress[0]);
     }
     protected void onPostExecute(Long result) {
         showDialog("Downloaded " + result + " bytes");
     }
     protected void onCancelled(){
        showDialog("Operation was cancelled");
     }
 }

查看官方文档中的"取消任务":http://developer.android.com/reference/android/os/AsyncTask.html

你可以通过这个

检查
@Override
protected Void doInBackground(Void... params) {
    function1;
    function2;
    if(!isCancelled() ) {
    function3;
    function4;
    }
return null;
}

最新更新