25

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

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

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

私の質問は、2 つの AsyncTask を並行して実行できないということですか? 両方の AsyncTask は異なり、独自の処理を行っています。それを行う方法はありますか。

4

3 に答える 3

47

Honeycomb リリースから AsyncTask に変更がありました。古いバージョンには 10 個のスレッドのスレッド プールがあったため、10 個のタスクを並行して実行できました。ただし、Honeycomb 以上の場合、デフォルトはシリアル エグゼキュータであり、タスクを 1 つずつ実行します。ThreadPoolExecutorただし、実行のためにa を渡すことができます。

   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();
   }
于 2012-12-17T09:07:55.970 に答える
37

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

したがって、ThreadPoolExecutorを作成してから使用します

単なる execute メソッドではなく、AsyncTask のexecuteOnExecutor

于 2012-12-17T08:26:28.910 に答える
4

別のオプションは、サポート 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
    }
});
于 2016-08-05T02:43:00.093 に答える