簡體   English   中英

Android線程 - 在執行所有其他線程之前執行一個線程

[英]Android Threading - Executing One thread before all others are executed

我是Android編程的新手,我有一個線程問題。

我基本上使用來自50個左右的URL的圖像填充GridView,但是在從已知的URL檢索JSON對象之前,將不知道這些URL。 我知道我必須為每個URL下載啟動一堆線程(使用AsyncTask類)。

我如何有效地對這些線程進行排隊,以便首先執行並完成JSON線程,這樣當我立即觸發這50個圖像線程后,我可以使用從該線程檢索的數據?

不要啟動50個線程。 使用單個線程。 雖然這應該與用於響應的UI線程分開,但是不需要生成多個線程,當然不是每個URL都有一個線程.ce

只需進行JSON網絡調用,然后解析響應,然后(在同一個線程中)循環遍歷請求每個響應的URL,並將結果解碼為Bitmap。 你可以在一些模型對象中將它們添加到GridView的適配器中,這會自動觸發GridView在UI線程上更新。

這里有更好的做法,例如延遲加載,緩存以及在加載圖像時顯示占位符圖像,但確切的實現變得過於復雜而無法在此處描述。 搜索WeakReferenceMap和LruCache以查找將動態圖像加載到AdapterView中的最佳實踐示例。

好吧,你可以運行第一次獲取,完成后,從這個主線程中激活50個線程。 當您從UI線程進行網絡通信時,Android 3.0及更高版本將終止您的應用程序, AsyncTask可能是獲取JSON的一種方式。 當它返回時,它可以觸發其他線程。

你還應該考慮的一件事是Android雖然功能強大,但仍然是功能有限的設備。 50線程可能會使用目標手機擁有的更多資源,因此您的應用可能會被系統殺死(例如,因為OOME)。 因此,桌面上的50個線程聽起來並不多,它們在手機上很多。

同樣是IIrc,http規范中有一個限制,即一個遠程服務器可能只有4個(?)同時連接。 因此,請考慮將圖像加載請求排隊並一個接一個地獲取它們。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM