我的活动有一个你可以在下面看到AsyncTask
的方法。doInBackground
我必须向多个服务器发出多个搜索请求,为了加快执行速度,我使用 JavaExecutorService
发出并发请求。
这工作正常,但我希望我AsyncTask
停止它正在做的任何事情并退出,如果我调用该AsyncTask.cancel();
方法true
作为mayInterruptIfRunning
参数。这在我需要在Activity
退出时停止任务的情况下很有用,例如按下“返回”按钮。
我读过调用 的cancel()
方法AsyncTask
将阻止该onPostExecute
方法被调用,但doInBackground
将运行直到完成。
有没有办法,我可以打断我Callables
并强迫他们停止他们正在做的任何事情并停止AsyncTask
.
为简洁起见,我在此处发布了我的代码的精简版,但我有一堆 a Callables
,而不仅仅是一个。
谢谢。
protected ArrayList<Result> doInBackground(final String... strQuery) {
ArrayList<Result> objResults = new ArrayList<Result>();
ExecutorService esrExecutor = Executors.newFixedThreadPool(2);
Set<Callable<ArrayList<Result>>> setCallables = new HashSet<Callable<ArrayList<Result>>>();
setCallables.add(new Callable<ArrayList<Result>>() {
public ArrayList<Result> call() throws Exception {
try {
MySearcher objSearcher = new MySearcher(Finder.this.objContext);
ArrayList<Result> objResults = new ArrayList<Result>();
objResults = objSearcher.doSearch(strQuery[0]);
return objResults;
} catch (Indexer.LoginException e) {
return null;
}
return null;
}
});
List<Future<ArrayList<Result>>> lstFutures;
try {
lstFutures = esrExecutor.invokeAll(setCallables);
for(Future<ArrayList<Result>> futFuture : lstFutures){
if (futFuture.get().isEmpty() == false)
objResults.addAll(futFuture.get());
}
} catch (InterruptedException e) {
e.printStackTrace();
} catch (ExecutionException e) {
e.printStackTrace();
}
esrExecutor.shutdown();
return objResults;
}