11

私はAsyncTask秒の数を実行し、すべての結果を集め、統合して最終結果を自分のユーザーに返す必要があります。ExecutorServiceをAndroid AsyncTaskで使用する方法は?

Androidで複数のAsyncTaskを管理する方法を検討しています。私はExecutorServiceをJava Concurrencyパッケージから使用することを考えていますが、ExecutorServiceはRunnablesまたはCallableのいずれかをとるため、スタックしてしまいます。私の要件を確立するために、私は

ExecutorService.invokeAll((Collection<? extends Callable<T>> tasks)

を使用することができますinvokeAll()方法は、すべての提出タスクが完了しているだけList<Future><V>>のリストを返しますし、私はそれに対応するFutureから、各タスクのための私の結果を得ることができます。

ExecutorServiceはすべて受け付けていません。AsyncTaskを受け取ります。

AsyncTaskExecutorServiceを使用する方法はありますか、別の方法をお勧めしますか。

+1

[AsyncTask](http://developer.android.com/reference/android/os/AsyncTask.html)にはexecuteOnExecutor()メソッドがあります。APIレベル11以降でしか使用できないということはありません。 – yorkw

+0

参照executeOnExecutorの使い方は?さらに、この機能はHoneyComb(APIレベル11)から入手できますが、私のアプリのminSDKは4です。 – AKh

+1

あなたが主張するなら、私の答え[ここ](http://stackoverflow.com/questions/7211684/asynctask-executeonexecutor-before- api-level-11/9509184#9509184)。 – yorkw

答えて

1

AsyncTaskを作成し、doInBackground()からスレッドを開始してください。それらが完了したら、データを収集し、統合し、それを返す。その後、それをonPostExecuteで使用してUIを更新することができます。あまりにも多くのスレッドを起動するとメモリが消費されるため、並列実行が本当に必要かどうかを検討する必要があります。

+0

AsyncTask自体には、内部にスレッドプールがあります。このプールを使用して、複数のタスクを実行する代わりに、別のタスクを作成することはできますか? – AKh

+1

直接ではありません。 'executeOnExecutor()'に関しては、このメソッドの目的は、同時に複数の 'AsyncTask'を同時に実行できるようにすることです。内部のAsyncTaskは一度に1つしか実行できません(Honeycomb以降)。つまり、同時に2つのAsyncTaskを開始すると、2つ目のAsyncTaskは開始前に最初に終了するのを待つことになります。もっと複雑なことをする必要がある場合は、いつものようにあなたのスレッディングコードだけを使用してAsyncTaskを使用する必要はなく、結果を取得したときにUIに通知するためにハンドラを使用します。 –

+0

"2つのAsyncTasksを同時に開始する場合、2つ目のAsyncTasksを同時に開始すると、開始する前に最初に完了するのを待機します。" – Zou

関連する問題