您的任務是否完成?你在處理適當的例外嗎?你創造了多少任務?
記住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和MAXIMUM_POOL_SIZE
爲128
sPoolWorkQueue
private static final BlockingQueue<Runnable> sPoolWorkQueue = new LinkedBlockingQueue<Runnable>(10);
這意味着該隊列的最大容量爲10個項目。
THREAD_POOL_EXECUTOR保持至少5個線程活着。隨着任務的添加,它們被添加到隊列中。當隊列填滿時,新的線程將被產生,最多128個(還有其他限制)。
發生這種情況時(128個線程,最大值,正在運行並且隊列已滿),則任何新任務將被拒絕,並使用默認處理程序處理(因爲它沒有明確設置,爲AbortPolicy
)一個RejectedExecutionException。
確保您不只是捕捉並且不處理這些異常。
解決此問題的一種方法是創建您自己的ExecutorService(即使它只是具有不同參數的ThreadPoolExecutor的實例),並配置最適合您情況的參數。像隊列這樣的參數(你可以控制它可以容納的物品的數量,或者它是無限的等等),或者如何處理被拒絕的任務。
爲什麼你不創建自己的游泳池呢? AsyncTask對於細粒度控制並不理想。 (請參閱Executors類。)也就是說,如果您有良好的行爲任務並且有對它們的引用,那麼您可以取消()任務。 – Delyan