web-dev-qa-db-ja.com

並列AsyncTaskの実行

アプリケーションにSplashActivityがあり、アプリケーションの起動時にAsyncTaskを使用していくつかの処理を実行しています。

サーバーからデータをダウンロードする別のAsyncTaskも作成しました。アプリケーションを閉じた後も、AsyncTaskがデータをダウンロードしています。

しかし、もう一度アプリケーションを起動すると、ダウンローダーのAsyncTaskが終了してアプリケーションがハングするまで、SplashActivityのAsyncTaskはそのバックグラウンド(doInBackground関数)を実行しません。

だから私の質問は、2つのAsyncTaskを並列に実行できないことですか?両方のAsyncTaskは異なり、独自のものを実行します。それを行う方法はありますか?.

24
sanjeev

AsyncTaskを実行するには、thread pool Executorを使用する必要があります。デフォルトの実装では、シングルスレッドで実行されるシリアルエグゼキュータを使用します

ThreadPoolExecutor を作成してから、

AsyncTaskの executeOnExecutor メソッドを実行するだけでなく

36
nandeesh

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();
   }
41
S.D.

別のオプションは、サポート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
    }
});
4
Arsenius

AsyncTaskは、ThreadPoolExecutorの周りのヘルパークラスとして設計されており、ユーザーがスレッドや操作に直接公開される必要がなくなります。

警告AsyncTaskは、短い操作(多くても数秒)を順番に実行するために使用する必要があります。

Android 9(APIレベル28)

順次-SERIAL_EXECUTOR

new MyAsyncTask().execute();

同時に-THREAD_POOL_EXECUTOR

new MyAsyncTask().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);

詳細 ここ および ここ

0
yoAlex5