15

AsyncTaskを使用して、リモートサーバーから多数のサムネイルを取得し、それらをグリッドビューに表示しています。問題は、グリッドビューに一度に20個のサムネイルが表示されるため、20個のAsyncTaskが作成され、サムネイルごとに1つずつ20回の実行が開始されることです。

RejectedExecutionコードで例外が発生します。AsyncTaskが一度にキューに入れることができるタスクの数に制限があることをどこかで読んだことを思い出します。私はそれにぶつかっているかもしれません。このバーは持ち上げられましたか?

この制限を増やす方法はありますか?この例外を無視しても安全ですか?(空のcatch(RejectedException e){}ブロックを使用することにより)

このコードはAndroid1.6エミュレーターで実行しており、コードのAPIレベル(minSDKVersionは3)です。[編集:SDKおよびAPIレベルの情報を追加]

4

5 に答える 5

17

AsyncTaskが一度にキューに入れることができるタスクの数に制限があることをどこかで読んだことを思い出します。私はそれにぶつかっているかもしれません。このバーは持ち上げられましたか?

AsyncTask現在、10個のスレッドと10個のワークキューの深さをサポートしているようです。理論的には、20個のアイテムをサポートするだけです...他に何も使用されていない場合AsyncTask

この制限を増やす方法はありますか?

ソースコードを入手して変更し、独自のパッケージに入れて使用します。AsyncTaskExこれはAndroid1.5ソースに基づいていますが、自分で行いました。

この例外を無視しても安全ですか?

あなたの仕事は実行のためにキューに入れられません。それが「安全」かどうかはあなた次第です。私はAsyncTaskインフラストラクチャへの他の影響を認識していません。

于 2010-03-22T15:40:10.847 に答える
7

私はこれとまったく同じことをアプリケーションで自分で行いました。

サーバーからサムネイルをダウンロードしてデータアダプターにプッシュするために一度に20の並列スレッドを起動することは、私には良い考えとは思えません。これらのスレッドはすべて、お互いにつまずいて、お互いの邪魔になります。

代わりに、スレッドを1つだけ起動し、サムネイルをループで収集して、到着時にアダプターに追加します。

于 2011-05-04T15:03:42.337 に答える
2

シリアルエグゼキューターをAsyncTask.executeOnExecutorと一緒に使用してタスクをシリアル化することもできますが、これにより、タスクは一度に1つの同時タスクのみに制限されます。サムネイルを取得するときは良いかもしれません:

myAsyncTask.executeOnExecutor(MyAsyncTask.SERIAL_EXECUTOR、[params]);

于 2012-05-14T17:57:47.597 に答える
2

問題は、保留中のAsyncTasksの数AsyncTask.THREAD_POOL_EXECUTORが128であるということです。キューがいっぱいになると、新しいAsyncTasksをキューに入れることができなくなります。

AsyncTaskソースコードから:

private static final BlockingQueue<Runnable> sPoolWorkQueue =
        new LinkedBlockingQueue<Runnable>(128);

私の意見では、制限はまったく意味がなくAsyncTask.SERIAL_EXECUTOR、無制限のキューがあります。

于 2014-06-25T08:52:10.650 に答える
1

無視する「安全」-実行後の実行を計画していたあらゆる種類の通知が、エラーをキャッチしたときにここで実行されることを確認する必要があります-そうしないと、他のコードがこのタスクからの返信。

于 2011-05-03T21:10:56.980 に答える