【发布时间】:2012-09-19 06:38:29
【问题描述】:
我的活动有一个AsyncTask,您可以在下面看到其doInBackground 方法。我必须向多个服务器发出多个搜索请求,为了加快执行速度,我使用了 Java 的 ExecutorService 来发出并发请求。
这工作正常,但我希望我的AsyncTask 停止它正在做的任何事情并退出,如果我用true 作为mayInterruptIfRunning 参数调用AsyncTask.cancel(); 方法。这在我需要在我的Activity 退出时停止任务的情况下很有用,例如按下“返回”按钮。
我读过调用AsyncTask 的cancel() 方法将阻止onPostExecute 方法被调用,但doInBackground 将一直运行直到它完成。
有没有办法,我可以打断我的Callables 并强迫他们停止正在做的事情并停止AsyncTask。
为简洁起见,我在此处发布了我的代码的删节版本,但我有一堆 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;
}
【问题讨论】:
标签: java android android-asynctask interrupt executorservice