2013-10-09 28 views
2

我想在AsyncTask.THREAD_POOL_EXECUTOR上運行一些AsyncTask。 我正在使用以下代碼。從AsyncTask中刪除並終止所有任務.THREAD_POOL_EXECUTOR

Tasks[i].executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, 
                   taskParams); 

後線的某些號碼被送到執行,不再接受新的AsyncTasks。 (我沒有看到任何錯誤,但doInBackGroundMethod由於某種原因未啓動)。

我懷疑會發生這種情況,因爲它池已滿。 有什麼辦法可以重置執行程序嗎? 我想完全終止所有任務,以便它將開始再次接受新任務並立即處理它們。

我試圖終止任務使用他們的取消方法,但它沒有幫助。

+0

爲什麼你不創建自己的游泳池呢? AsyncTask對於細粒度控制並不理想。 (請參閱Executors類。)也就是說,如果您有良好的行爲任務並且有對它們的引用,那麼您可以取消()任務。 – Delyan

回答

2

您的任務是否完成?你在處理適當的例外嗎?你創造了多少任務?

記住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的實例),並配置最適合您情況的參數。像隊列這樣的參數(你可以控制它可以容納的物品的數量,或者它是無限的等等),或者如何處理被拒絕的任務。

1

我可以看到兩個原因。取消AsyncTasks仍在運行:

  • 要麼你不叫cancelmayInterruptIfRunning設置爲true
  • 要麼你就打電話AsyncTask.cancel(true)InterruptedException被誤處理執行的代碼:確保您的代碼(以及可能的後續庫調用)不會通過InterruptedException s或甚至Exception上的try/catch混淆/沉默InterruptedException