我的活動有一個AsyncTask
其doInBackground
方法,你可以在下面看到。我必須向多個服務器發出多個搜索請求,爲了加速執行,我使用Java的ExecutorService
來發出併發請求。當AsyncTask.cancel()方法被調用時,如何在AsyncTask中中斷Callables?
這工作得很好,但我想我AsyncTask
停止正在執行的任何不幹,如果我叫了AsyncTask.cancel();
法true
爲mayInterruptIfRunning
參數。這在我需要在我的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;
}
我想'futFuture.get()'是要阻止用戶界面,對吧? –
@Lalit Poptani:是嗎?我還沒有檢查過,但'futFuture.get()'阻塞似乎是合乎邏輯的。 –
是的,我只是在YouTube上觀看Callable&Future的視頻,它說我會阻止UI,直到任務完成。這裏[是](https://www.youtube.com/watch?v=lnbWFV4b7M4) –