2012-07-23 165 views
1

我是Android編程的新手,我遇到了線程問題。Android線程 - 在執行所有其他線程之前執行一個線程

我基本上填充有來自50頁左右的URL圖像的GridView控件,但這些URL不會知道,直到我從已知URL獲取一個JSON對象。我知道我必須爲每個URL下載啓動一堆線程(使用AsyncTask類)。

如何才能使執行JSON線程,首先完成了我有效地排隊這些線程,這樣我就可以使用來自該線程,當我後,立即火了那些50個圖像線程檢索到的數據?

回答

1

那麼,你可以運行第一次抓取,當這個完成時,從這個主線程中激發50個線程。由於Android 3.0和更高版本會在您從UI線程進行網絡通信時終止您的應用,因此AsyncTask可能是獲取JSON的一種方式。當這返回它可能會觸發其他線程。

有一點你應該考慮的是,儘管Android功能強大,但仍然是功能有限的設備。 50個線程可能會使用目標手機具有的更多資源,因此係統可能會殺死您的應用程序(例如,由於OOME)。所以,在桌面上,50個線程聽起來並不多,他們在電話上很多。

此外IIRC,有在HTTP規範中的一個限制,即一個可以只具有4(?)同步到一個遠程服務器連接。因此,考慮排隊映像加載請求並逐個獲取它們。

+0

我使用AsyncTask檢索圖像(使用虛擬URL)。這工作正常。但我不確定如何組織這些線程,直到另一個AsyncTask線程檢索該JSON對象時才基本不觸發 – ZakTaccardi 2012-07-23 02:24:50

+0

它不僅僅是圖像加載,它首先是DNS請求。儘管如此,四個線程和一個生產者 - 消費者隊列肯定會比一個線程更快,並且在資源有限的移動設備中,限制4似乎是合理的開始。我可能會讓它可配置,所以我可以輕鬆地嘗試不同的線程池深度。 – 2012-07-23 03:53:51

2

不要啓動50個線程。使用單個線程。雖然這應該與UI線程的響應性分開,但沒有必要產生多個線程,並且每個URL肯定不會有一個線程。只需使您的JSON網絡調用,然後解析響應,然後(在相同的線程)遍歷請求每個URL的URL,並將結果解碼爲Bitmap。你可以將它們添加到你的GridView的適配器的模型對象中,它會自動觸發GridView在UI線程上更新。

這裏有更好的做法,如延遲加載,緩存,並顯示一個佔位符圖像載入圖像時,但確切的實現變得過於複雜,在這裏描述。搜索WeakReferenceMap和LruCache以查找將動態圖像加載到AdapterView中的最佳實踐示例。

+1

因此,這是50個連續的DNS查找和50個連續的HTTP GET請求。爲什麼你說單線程是一個好方法,特別是考慮到無線鏈路的延遲? – 2012-07-23 03:48:34

+0

因爲如果你並行啓動50個請求,你的用戶將在任何一個完成加載之前退出應用程序。 – 2012-07-23 11:24:46

+0

我基本上做沿着http://android-developers.blogspot.com/2010/07/multithreading-for-performance.html 線的東西它不會做50一次,目前只是無論是在gridview。它工作正常。這不是問題 只要GridView中的網格元素嘗試填充自己,就會創建一個新線程 – ZakTaccardi 2012-07-23 14:00:12