私のアクティビティには、以下に示すメソッドAsyncTask
がありdoInBackground
ます。複数のサーバーに対して複数の検索リクエストを行う必要があり、実行を高速化するために、Java を使用ExecutorService
して同時リクエストを作成しました。
これは問題なく動作しますが、パラメーターとしてメソッドAsyncTask
を呼び出す場合は、実行中のものをすべて停止して終了したいと思います。これは、「戻る」ボタンが押されたときなど、終了時にタスクを停止する必要がある場合に役立ちます。AsyncTask.cancel();
true
mayInterruptIfRunning
Activity
cancel()
のメソッドを呼び出すと、メソッドが呼び出されなくなりますが、は完了するまで実行されるAsyncTask
ことを読みました。onPostExecute
doInBackground
方法はありますか、私は私の話を中断してCallables
、彼らがしていることを強制的に止めさせ、AsyncTask
.
簡潔にするために、コードの要約版をここに投稿しましたが、1 つだけでなく、たくさんの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;
}