AsyncTask、RejectedExecutionException、およびタスク制限
-
21-09-2019 - |
質問
AsyncTask を使用して、リモート サーバーから大量のサムネイルを取得し、グリッド ビューに表示しています。問題は、私のグリッド ビューには一度に 20 個のサムネイルが表示されるため、20 個の AsyncTask が作成され、サムネイルごとに 1 つずつ、20 個の実行が開始されることです。
分かりました RejectedExecution
私のコードの例外です。AsyncTask が一度にキューに入れることができるタスクの数には制限があるとどこかで読んだことを思い出しました。私はそれに達しているのかもしれません。このバーは解除されましたか?
この制限を増やす方法はありますか?この例外を無視しても安全ですか?(空の例外を指定することで) catch(RejectedException e){}
ブロック?)
このコードを Android 1.6 エミュレータとコードの API レベル (minSDKVersion は 3) で実行しています。[編集:SDKとAPIレベルの情報を追加]
解決
Asynctaskが一度にキューに載せることができるタスクの数に制限があることをどこかに読んだことを思い出します。私はそれを打つかもしれません。このバーは持ち上げられましたか?
AsyncTask
現在、10 個のスレッドと 10 のワーク キューの深さをサポートしているようです。理論的には、他に何も使用していない場合、これは 20 個の項目をサポートするだけです。 AsyncTask
.
この制限を増やす方法はありますか?
ソース コードを取得して変更し、独自のパッケージに入れて使用します。私はこれを私のものでやりました AsyncTaskEx
, ただし、これは Android 1.5 のソースに基づいています。
この例外を無視するだけで安全ですか?
あなたの作業は実行のためにキューに入れられません。それが「安全」かどうかはあなた次第です。その他の影響についてはわかりません。 AsyncTask
インフラストラクチャー。
他のヒント
私は、アプリケーションでこのまったく同じことを自分自身をやった。
サーバからのダウンロードのサムネイルを一度に20個の並列スレッドを起動し、データアダプタにプッシュすることは私には良い考えのような音はありません。すべてのこれらのスレッドは、ちょうどすべて互いにつまずくと、お互いの邪魔になります。
その代わり、私はそれがループ内でサムネイルを集め、彼らが到着すると、アダプタに追加します。
持って、ただ一つのスレッドを起動しますあなたは、あなたのタスクをシリアル化するために、AsyncTask.executeOnExecutorとシリアルexecutorを使用することができますが、それは同時に複数の同時タスクにタスクを制限します。良いかもしれませんがサムネイルを取得するときます:
myAsyncTask.executeOnExecutor(MyAsyncTask.SERIAL_EXECUTOR、[paramsは]);
問題は、キューが新しいAsyncTasksがキューに入れないことができるまで満たされるとAsyncTask.THREAD_POOL_EXECUTOR
のためのの保留のAsyncTasksの数は128であるということです。
private static final BlockingQueue<Runnable> sPoolWorkQueue =
new LinkedBlockingQueue<Runnable>(128);
制限がすべてとAsyncTask.SERIAL_EXECUTOR
では全く意味がないというのが私の意見では、は無制限のキューを持っています。
「安全」 - あなたの他のコードあればそうでない場合は、あなたが何かをぶら下げを残すかもしれない - あなたがエラーをキャッチしたときに、ポストの実行中に行うことを計画していたという通知のいずれかの種類がここで行われることを確認する必要がありますこの作業から戻って聞いに関する仮定をします。