アプリケーションにSplashActivityがあり、アプリケーションの起動時にAsyncTaskを使用していくつかの処理を実行しています。
サーバーからデータをダウンロードする別のAsyncTaskも作成しました。アプリケーションを閉じた後も、AsyncTaskがデータをダウンロードしています。
しかし、もう一度アプリケーションを起動すると、ダウンローダーのAsyncTaskが終了してアプリケーションがハングするまで、SplashActivityのAsyncTaskはそのバックグラウンド(doInBackground関数)を実行しません。
だから私の質問は、2つのAsyncTaskを並列に実行できないことですか?両方のAsyncTaskは異なり、独自のものを実行します。それを行う方法はありますか?.
AsyncTask
を実行するには、thread pool Executor
を使用する必要があります。デフォルトの実装では、シングルスレッドで実行されるシリアルエグゼキュータを使用します
ThreadPoolExecutor を作成してから、
AsyncTaskの executeOnExecutor メソッドを実行するだけでなく
HoneycombリリースからAsyncTaskに変更がありました。古いバージョンには10スレッドのスレッドプールがあったため、10個のタスクを並行して実行できました。ただし、Honeycomb以降の場合、デフォルトはシリアルエグゼキュータで、タスクを1つずつ実行します。ただし、ThreadPoolExecutor
を渡して実行できます。
if (Build.VERSION.SDK_INT >= 11) {
//--post GB use serial executor by default --
task.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
} else {
//--GB uses ThreadPoolExecutor by default--
task.execute();
}
別のオプションは、サポートv.4ライブラリの AsyncTaskCompat を使用することです。
AsyncTaskCompat.executeParallel(new AsyncTask<Void, Void, Object>() {
@Override
protected Object doInBackground(Void... params) {
// do your parallel task here
return null;
}
@Override
protected void onPostExecute(Object result) {
// and fetch result
}
});
AsyncTask
は、ThreadPoolExecutor
の周りのヘルパークラスとして設計されており、ユーザーがスレッドや操作に直接公開される必要がなくなります。
警告:AsyncTask
は、短い操作(多くても数秒)を順番に実行するために使用する必要があります。
Android 9(APIレベル28)
順次-SERIAL_EXECUTOR
new MyAsyncTask().execute();
同時に-THREAD_POOL_EXECUTOR
new MyAsyncTask().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);