2010-03-22 34 views
15

我從遠程服務器獲取大量縮略圖,並使用AsyncTask將其顯示在網格視圖中。問題是,我的網格視圖一次顯示20個縮略圖,因此創建20個AsyncTasks並啓動20個,每個縮略圖一個。AsyncTask,RejectedExecutionException和任務限制

我在我的代碼中得到RejectedExecution異常。我記得在某處讀到AsyncTask在隊列中一次可以有的任務數量是有限制的,我可能會達到這個數量。這個酒吧解除了嗎?

有沒有辦法增加這個限制?忽略這個異常是否安全?(通過有一個空的catch(RejectedException e){}塊?)

我在Android 1.6模擬器上運行此代碼並在我的代碼中使用API​​級別(minSDKVersion爲3)。 [編輯:添加SDK和API級信息]

回答

17

我記得讀書的地方,有 是到 的AsyncTask可以在 時間在其隊列中的任務數的限制,我可能會打那個。這個酒吧解除了 ?

AsyncTask似乎目前支持10個線程和10理論上,工作隊列深度,這將僅僅支持20個項目......如果沒有其他人使用AsyncTask

有沒有辦法增加這個限制?

抓住源代碼,修改它,把它放在你自己的包中,然後使用它。我用我的AsyncTaskEx做了這個,雖然這是基於Android 1.5源。

忽略此 異常是否安全?

您的工作不會排隊等候執行。這是否「安全」取決於你。我不知道對AsyncTask基礎設施有任何其他影響。

+0

感謝馬克的回覆,也分享您的代碼! 順便說一句,根據羅曼蓋伊的評論在這裏:http://stackoverflow.com/questions/990948/simple-thread-management-java-android限制似乎已放寬。 – Samuh 2010-03-22 17:06:39

+0

不幸的是,我無法證實他的說法。上面的內容來自我對源代碼的檢查(通過谷歌代碼搜索找到)。不過,這可能是我誤解了代碼。 – CommonsWare 2010-03-22 17:12:02

+0

我遇到了同樣的問題。我會很高興讓我的任務按順序執行而不是並行執行。有沒有辦法做到這一點?還是我要回去實施一個工作隊列? – 2010-08-22 19:51:59

1

要忽略的「安全」 - 您需要確保您在執行後計劃執行的任何類型的通知都會在您發現錯誤時完成 - 否則如果您的其他人可能會留下某些內容代碼做出有關從此任務回聽的假設。

7

我在應用程序中自己完成了同樣的事情。

一次啓動20個並行線程以從服務器下載縮略圖並將它們推送到數據適配器對我來說聽起來不是一個好主意。所有這些線程都會彼此相遇,彼此相處。

取而代之,我只會啓動一個線程,讓它在循環中收集縮略圖,並在它們到達時將它們添加到適配器中。

2

您可以使用串行執行程序和AsyncTask.executeOnExecutor來序列化您的任務,但這將限制任務在當時僅限一個併發任務。雖然在獲取縮略圖時可能會很好:

myAsyncTask.executeOnExecutor(MyAsyncTask。SERIAL_EXECUTOR,[params]);

2

問題是正在等待對於AsyncTask.THREAD_POOL_EXECUTOR的AsyncTasks是128.一旦隊列被填滿,沒有新的AsyncTasks可以排隊。

從的AsyncTask代碼:

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

在我看來這一限制使得完全沒有任何意義和AsyncTask.SERIAL_EXECUTOR有無限的隊列。