あなたの仕事は終わっていますか?適切な例外を処理していますか? いくつのタスクを作成していますか?
AsyncTask.THREAD_POOL_EXECUTOR
(少なくともAPI 17では、このドキュメントページには役立つ詳細がたくさんあります)、で設定されていることに注意してください
public static final Executor THREAD_POOL_EXECUTOR = new ThreadPoolExecutor(CORE_POOL_SIZE, MAXIMUM_POOL_SIZE, KEEP_ALIVE, TimeUnit.SECONDS, sPoolWorkQueue, sThreadFactory);
CORE_POOL_SIZE
は 5 で128MAXIMUM_POOL_SIZE
です。
sPoolWorkQueue と
private static final BlockingQueue<Runnable> sPoolWorkQueue = new LinkedBlockingQueue<Runnable>(10);
これは、キューの最大容量が 10 項目であることを意味します。
THREAD_POOL_EXECUTOR は、少なくとも 5 つのスレッドを有効に保ちます。タスクが追加されると、キューに追加されます。キューがいっぱいになると、最大 128 個の新しいスレッドが生成されます (他にも制限があります)。
これが発生すると (最大 128 個のスレッドが実行され、キューがいっぱいになると)、新しいタスクはすべて拒否され、既定のハンドラー (明示的に設定されていないため、 is ) で処理され、 RejectedExecutionExceptionAbortPolicy
がスローされます。
そのような例外をキャッチして処理しないだけではないことを確認してください。
これに対処する 1 つの方法は、独自のExecutorServiceを作成し (異なるパラメーターを持つ ThreadPoolExecutor のインスタンスであっても)、状況に最適なパラメーターを構成することです。キューなどのパラメーター (保持できるアイテムの量を制御できるか、無制限かどうかなど) や、拒否されたタスクの処理方法。