2011-06-09 43 views
12

我對ThreadPoolExecutor有點困惑。這是我想要實現的:如何使用AsyncTask與ThreadPoolExecutor

我有一個列表視圖,它填充了左側的圖像圖標和右側的簡短描述。我已經將所有文本靜態地定義了,但是我想從網絡上獲取圖標。我已經知道如何從url獲取圖像,但是我不想爲每個圖標產生「n」個線程來獲取圖標圖像。所以我讀了asynctask的threadpoolexecutor,我不知道如何去做。你們能給我一個開始嗎?我是否必須創建一個threadpoolexecutor並在其中使用asynctasks?

我的清單是這樣的..沒有圖標。

___________________________ 
[icon][a short description] 
____________________________ 
[icon][a short description] 
_____________________________ 
[icon][a short description] 
_____________________________ 
[icon][a short description] 
____________________________ 

回答

8

我會推薦使用AsyncTask,而不用擔心ThreadPoolExecutor,它需要HoneyComb。 AsyncTask有一個線程池,將被重用於你的所有列表項。它不會爲每個圖標創建一堆線程。

請記住,您的任務將在Android 2.x上並行運行,並跟蹤代碼可能存在的任何同步問題。

+0

當我在我的異步任務中做Log.d(標記,「創建」)時,它顯示創建了'n'線程數量。所以你說什麼即使它們被創建,Async有一個內部的方法來控制它的線程池? – HAxxor 2011-06-10 02:46:15

+0

您需要爲每個您擁有並執行的任務創建一個新的AsyncTask實例。你不應該重用這些實例。 AsyncTask管理線程池,所有任務共享該池。 – 2011-06-10 15:48:31

+4

@StevePrentice根據文檔[ThreadPoolExecutor](http://developer.android.com/reference/java/util/concurrent/ThreadPoolExecutor.html)從API級別1開始可用。我認爲這是最好的解決方案。 – 2012-03-18 08:26:01

4

您將需要使用方法executeOnExecutor()來啓動它與您自己的執行者。

似乎有一些陷阱,所以仔細閱讀AsyncTask的整個頁面。

所以是的,你可以創建你自己的ThreadPoolExecutor並與AsyncTask一起使用它。

+0

謝謝你生病了!看起來很討厭使用..大聲笑 – HAxxor 2011-06-09 23:56:51

+0

但是,這是不適用於低於11的API級別 – rallat 2014-05-09 22:43:06