天天看點

執行個體示範Android異步加載圖檔(轉)

本文給大家示範異步加載圖檔的分析過程。讓大家了解異步加載圖檔的好處,以及如何更新UI。

首先給出main.xml布局檔案:

簡單來說就是 LinearLayout 布局,其下放了2個TextView和5個ImageView。

執行個體示範Android異步加載圖檔(轉)
執行個體示範Android異步加載圖檔(轉)

我們将示範的過程是異步從伺服器上下載下傳5張不同圖檔,依次放入這5個ImageView。上下2個TextView 是為了友善我們看是否阻塞了UI的顯示。 當然 AndroidManifest.xml 檔案中要配置好網絡通路權限。 

1)Handler+Runnable模式

我們先看一個并不是異步線程加載的例子,而是使用 Handler+Runnable模式。

注意這裡不是新開的線程,這裡的代碼其實是在UI主線程中下載下傳圖檔的。

我們運作下面代碼時,會發現它其實是阻塞了整個界面的顯示,需要所有圖檔都加載完成後,才能顯示界面

執行個體示範Android異步加載圖檔(轉)
執行個體示範Android異步加載圖檔(轉)

2)Handler+Thread+Message模式

這種模式使用了線程,是以可以看到異步加載的效果。

核心代碼:

執行個體示範Android異步加載圖檔(轉)
執行個體示範Android異步加載圖檔(轉)

這時候我們可以看到實作了異步加載, 界面打開時,五個ImageView都是沒有圖的,然後在各自線程下載下傳完後才把圖自動更新上去。

3)Handler+ExecutorService(線程池)+MessageQueue模式

能開線程的個數畢竟是有限的,我們總不能開很多線程,對于手機更是如此。

這個例子是使用線程池。Android擁有與Java相同的ExecutorService實作,我們就使用它。

線程池的基本思想還是一種對象池的思想,開辟一塊記憶體空間,裡面存放了衆多(未死亡)的線程,池中線程執行排程由池管理器來處理。當有線程任務時,從池中取一個,執行完成後線程對象歸池,這樣可以避免反複建立線程對象所帶來的性能開銷,節省了系統的資源。

下面的示範例子是建立一個可重用固定線程數的線程池。

核心代碼

執行個體示範Android異步加載圖檔(轉)
執行個體示範Android異步加載圖檔(轉)

這裡我們象第一步一樣使用了

handler.post(new Runnable() { }) 更新前段顯示當然是在UI主線程,我們還有 executorService.submit(new Runnable() { }) 來確定下載下傳是線上程池的線程中。

4)Handler+ExecutorService(線程池)+MessageQueue+緩存模式

下面比起前一個做了幾個改造:

把整個代碼封裝在一個類中,同時為了避免出現同時多次下載下傳同一幅圖的問題,使用了本地緩存封裝的類:

執行個體示範Android異步加載圖檔(轉)
執行個體示範Android異步加載圖檔(轉)

說明:

final參數是指當函數參數為final類型時,你可以讀取使用該參數,但是無法改變該參數的值。

這裡使用SoftReference 是為了解決記憶體不足的錯誤(OutOfMemoryError)的。

前端調用:

執行個體示範Android異步加載圖檔(轉)
執行個體示範Android異步加載圖檔(轉)

<a>本文轉自歡醉部落格園部落格,原文連結http://www.cnblogs.com/zhangs1986/p/3236521.html如需轉載請自行聯系原作者</a>

<a></a>

<a>歡醉</a>

繼續閱讀