当调用AsyncTask.cancel()方法时,如何在AsyncTask中中断Callables?

时间:2012-09-19 06:38:30

标签: java android android-asynctask interrupt executorservice

我的活动有一个AsyncTask,其doInBackground方法可以在下面看到。我必须向多个服务器发出多个搜索请求,为了加快执行速度,我使用了Java的ExecutorService来发出并发请求。

这样可行但我希望我的AsyncTask停止正在进行的操作并退出,如果我使用AsyncTask.cancel();方法调用true作为mayInterruptIfRunning参数。这在我Activity退出时需要停止任务的情况下非常有用。按下“后退”按钮。

我已经读过调用cancel()的{​​{1}}方法会阻止调用AsyncTask方法,但onPostExecute会一直运行直到完成。

有没有办法,我可以打断我的doInBackground并迫使他们停止他们正在做的事情并停止Callables

为了简洁起见,我在这里发布了我的代码的删节版本,但我有一堆AsyncTask,而不仅仅是一个。

感谢。

Callables

3 个答案:

答案 0 :(得分:3)

我认为一种解决方案是定期检查doInBackground()方法中的isCancelled(),以检查AsyncTask是否已取消,以及是否需要停止之前的操作。

答案 1 :(得分:1)

这是你迭代等待的地方:

   for(Future<ArrayList<Result>> futFuture : lstFutures){
          if (futFuture.get().isEmpty() == false)
              objResults.addAll(futFuture.get());
      }

未来的get()方法,Waits if necessary for the computation to complete, and then retrieves its result. 您可以像这样检查isCancelled()

       for(Future<ArrayList<Result>> futFuture : lstFutures){
           if(isCancelled())
              break;
           else if (futFuture.get().isEmpty() == false)
              objResults.addAll(futFuture.get());
      }
      if(isCancelled())esrExecutor.shutdownNow();

答案 2 :(得分:0)

另一个选项,例如,如果doSearch有一个循环,您可以手动执行,而无需使用isCancelledcancel。你的MySearcher课程可以有以下内容。

//in your MySearcher class
private AtomicBoolean cancelled = false;

public ArrayList<Result> doSearch(...){
    while(notFound && !cancelled.get()){
     // keep searching
    }
}

public void cancel(){
    cancelled.set(true);
}

现在你可以从任何地方打电话取消。