2012-12-17 14 views
20

私はアプリケーションを起動するときにAsyncTaskを使用していくつかのものを行う私のアプリケーションでSplashActivityを持っています。並列AsyncTaskを実行中

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

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

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

+0

関連するコードを投稿してください(タスクと呼び出しアクティビティ) –

答えて

30

AsyncTaskを実行するには、thread pool Executorを使用する必要があります。デフォルトの実装では、単一のスレッド

上で実行されているシリアルexecutorを使用していますので、ThreadPoolExecutorを作成し、

AsyncTaskのexecuteOnExecutorを使用するだけではなく方法

+0

この方法を使用するといくつかの種類の欠点がありますか?私。 AsyncTaskを並列にすることで余分な作業をしなければなりませんか? –

+2

@ Gee.Eは、イン​​スタンス化されたスレッドが1つしかないので、デフォルトのエグゼキュータを使用するほうが優れています。同時に実行するタスクがあまり多くない場合、デフォルトのエグゼキュータがパフォーマンスを向上させますが、あなたはThreadPoolExecutorが必要かもしれません。 – nandeesh

+0

@neeseesh Roger、私はキャッシュされたデータベースからデータをフェッチするために並列タスクを使用しています。複雑な理由から、私は並列処理を実行するためにfetcher-taskが必要ですが、時間がかからないのでパフォーマンスの低下は見られません。いずれにせよ、問題を説明してくれてありがとう。 –

35

を実行ハニカムリリースからAsyncTaskの変化がありました。古いバージョンのスレッドプールは10スレッドなので、10個のタスクを並行して実行できます。しかし、ハニカム以上の場合、デフォルトはシリアルエグゼキュータで、タスクを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(); 
    } 
+3

最後の引数 'new Void [] {}'を指定する必要はありません。これを省略することで十分である。 –

+0

IDEが間違っています。 varargsは配列を作成するためのショートカットですので、もちろんパラメータリストは空にすることができます。実際、あなたのような新しい配列を提供することは実際には悪いことです。あなたは不必要にオブジェクトをインスタンス化しています。 GCをもう一度クリーンアップするには、アプリを数ミリ秒間休止して一時停止する必要があります。 –

+0

ありがとう!魅力のように動作します。そして、Androidのドキュメントではこれをもっと明確にすることはできませんでした: "public static final Executor THREAD_POOL_EXECUTOR。APIレベル11で追加 - 並列でタスクを実行するために使用できるExecutor。" – Luis

5

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

このクラスはAPIレベル26で廃止され、APIレベル27では削除されました –