web-dev-qa-db-ja.com

AsyncTask execute()またはexecuteOnExecutor()?

execute()executeOnExecuter()の使用の違いは何ですか?

  • デフォルトでexecute()はどのようにタスクを実行しますか? (シリアルまたはパラレルで?)

  • 16を超える新しいSDKには何を使用すべきですか?

  • 並列実行(THREAD_POOL_EXECUTOR)アプリケーションにとって重要ではない場合や、実行されるAsyncTasksの数に依存する場合でも、シリアルではなくタスクの場合

47
rashad.z

.executeは、デフォルトで(シリアルまたはパラレルで)タスクを実行します。

APIレベル11より前:並列。

APIレベル11以降:シリアル。

16以上の新しいSDKに使用する必要があります(executeOnExecuter?)

要件に依存します。デフォルトのエグゼキューターに満足している場合は、execute()を使用します。そうでない場合は、明示的なエグゼキューターを使用します。

アプリケーションにとって重要ではない場合や、実行される非同期タスクの数に依存する場合でも、シリアルではなくタスクにパラレル実行(THREAD_POOL_EXECUTOR)を使用することをお勧めしますか?

非同期タスクは、比較的短いバックラウンド操作にのみ使用してください。 AsyncTaskドキュメントの引用:

AsyncTasksは、短い操作(最大で数秒)に使用するのが理想的です。スレッドを長時間実行し続ける必要がある場合は、Java.util.concurrentパッケージによって提供されるさまざまなAPIを使用することを強くお勧めします。エグゼキューター、ThreadPoolExecutor、およびFutureTask。

非同期タスクの実行中、エグゼキュータースレッドは他のタスクを実行できません。エグゼキュータースレッドが1つしかないシリアルエグゼキューターでは、タスクの実行時間が長すぎる場合に問題を検出しやすくなります。このような問題を検出する並列エグゼキューターでは、より多くの同時実行タスクが必要になります。

したがって、本当に並列エグゼキューターに切り替える必要がある場合は、設計を再検討することをお勧めします。

46
laalto

。execute()-この関数は、単一のバックグラウンドスレッドのキューでタスクをスケジュールします。 2つのAsyncTasksを呼び出し、.execute()メソッドを使用してそれらを呼び出す場合、それらはキューで実行されることを意味します(最初に2番目)。

。executeOnExecutor()-両方のAsyncTasksの並列実行が必要な場合、このメソッドを使用してAsyncTaskを実行できます。両方のasyncTasksが同時に実行されることを意味します。

簡単に言うと:.execute()メソッドはasyncTasksの実行用に単一のスレッドを作成し、.executeOnExecuter()メソッドはayncTaskごとに個別のスレッドを作成します。

.executeは、デフォルトでタスクをシリアル順に実行します。

編集済み: executeOnExecutor()を使用する場合は、次のコードを使用できます。

if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB)
     task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
 else
     task.execute();

HONEYCOMB execute()メソッドの前に、AsynkTaskを並行して実行します。

81
Rahul Sharma