我的活动有一个AsyncTask
,其doInBackground
方法可以在下面看到。我必须向多个服务器发出多个搜索请求,为了加快执行速度,我使用了Java的ExecutorService
来发出并发请求。
这样可行但我希望我的AsyncTask
停止正在进行的操作并退出,如果我使用AsyncTask.cancel();
方法调用true
作为mayInterruptIfRunning
参数。这在我Activity
退出时需要停止任务的情况下非常有用。按下“后退”按钮。
我已经读过调用cancel()
的{{1}}方法会阻止调用AsyncTask
方法,但onPostExecute
会一直运行直到完成。
有没有办法,我可以打断我的doInBackground
并迫使他们停止他们正在做的事情并停止Callables
。
为了简洁起见,我在这里发布了我的代码的删节版本,但我有一堆AsyncTask
,而不仅仅是一个。
感谢。
Callables
答案 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
有一个循环,您可以手动执行,而无需使用isCancelled
或cancel
。你的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);
}
现在你可以从任何地方打电话取消。