本文給大家示範異步加載圖檔的分析過程。讓大家了解異步加載圖檔的好處,以及如何更新UI。
首先給出main.xml布局檔案:
簡單來說就是 LinearLayout 布局,其下放了2個TextView和5個ImageView。
我們将示範的過程是異步從伺服器上下載下傳5張不同圖檔,依次放入這5個ImageView。上下2個TextView 是為了友善我們看是否阻塞了UI的顯示。 當然 AndroidManifest.xml 檔案中要配置好網絡通路權限。
1)Handler+Runnable模式
我們先看一個并不是異步線程加載的例子,而是使用 Handler+Runnable模式。
注意這裡不是新開的線程,這裡的代碼其實是在UI主線程中下載下傳圖檔的。
我們運作下面代碼時,會發現它其實是阻塞了整個界面的顯示,需要所有圖檔都加載完成後,才能顯示界面
2)Handler+Thread+Message模式
這種模式使用了線程,是以可以看到異步加載的效果。
核心代碼:
這時候我們可以看到實作了異步加載, 界面打開時,五個ImageView都是沒有圖的,然後在各自線程下載下傳完後才把圖自動更新上去。
3)Handler+ExecutorService(線程池)+MessageQueue模式
能開線程的個數畢竟是有限的,我們總不能開很多線程,對于手機更是如此。
這個例子是使用線程池。Android擁有與Java相同的ExecutorService實作,我們就使用它。
線程池的基本思想還是一種對象池的思想,開辟一塊記憶體空間,裡面存放了衆多(未死亡)的線程,池中線程執行排程由池管理器來處理。當有線程任務時,從池中取一個,執行完成後線程對象歸池,這樣可以避免反複建立線程對象所帶來的性能開銷,節省了系統的資源。
下面的示範例子是建立一個可重用固定線程數的線程池。
核心代碼
這裡我們象第一步一樣使用了
handler.post(new Runnable() { }) 更新前段顯示當然是在UI主線程,我們還有 executorService.submit(new Runnable() { }) 來確定下載下傳是線上程池的線程中。
4)Handler+ExecutorService(線程池)+MessageQueue+緩存模式
下面比起前一個做了幾個改造:
把整個代碼封裝在一個類中,同時為了避免出現同時多次下載下傳同一幅圖的問題,使用了本地緩存封裝的類:
說明:
final參數是指當函數參數為final類型時,你可以讀取使用該參數,但是無法改變該參數的值。
這裡使用SoftReference 是為了解決記憶體不足的錯誤(OutOfMemoryError)的。
前端調用:
<a>本文轉自歡醉部落格園部落格,原文連結http://www.cnblogs.com/zhangs1986/p/3236521.html如需轉載請自行聯系原作者</a>
<a></a>
<a>歡醉</a>