1. 程式人生 > >從零開始打造一個新聞訂閱APP之Android篇(三、關於圖片載入、展示的那些事)

從零開始打造一個新聞訂閱APP之Android篇(三、關於圖片載入、展示的那些事)

在上一篇文章 如何開發一個新聞訂閱APP之Android篇(二、從“逛”頁面談談多種格式listview的實現細節)中,我介紹了lsitView的多種佈局的實現細節,這其中包含了很多圖片的顯示。其實當前比較流行的APP中,隨處可見大量的圖片,這裡把自己遇到的一些問題總結出來,
簡單的載入圖片通常需要注意以下兩個細節:
1、在開發android程式時,如果你在UI執行緒,也就是主執行緒中做了類似於網路連線這些事的時候,程式是不能執行的。因為android的開發規範要求,主UI執行緒不允許處理一些耗時任務,如果需要連線網路獲取資料,你需要在子執行緒中完成這件事。android提供了Handler和AsyncTask等封裝好的非同步訊息處理機制。它們使得你非常方便的在子執行緒和UI執行緒之間進行通訊和切換。關於AsyncTask,這篇文章講的非常透徹

Android AsyncTask完全解析,帶你從原始碼的角度徹底理解,這裡就不多贅述了。

2、這個列表頁有很多的圖片。很容易想象,手機的記憶體資源是很寶貴的,如果不對記憶體加以控制,可能APP很快就會出現OOM錯誤。控制記憶體溢位有很多方法,一般來講,都是利用快取機制,通常有記憶體快取和Disk快取兩層控制即可。
對於程式中圖片的記憶體控制問題,這篇博文同樣講的非常透徹:
Android高效載入大圖、多圖解決方案,有效避免程式OOM

除此之外,初學者很可能會遇到的一個坑是圖片的大小和imageView大小之間的關係。如果你將一張大於螢幕大小的圖片不經處理直接載入到imageView中,這本身沒有什麼問題,圖片會根據你的imageView的設定自動縮放(除非單張圖片直接超過了android預設的記憶體限制,圖片會無法顯示),但是可能依據你的程式實現會出現不同的問題。在我的程式中一開始出現的問題是listView滑動會特別卡,通過日誌列印,發現圖片平均每張接近7,80KB,可是這也不大啊。但在debug程式的時候,發現LRUCache只能儲存5個左右的圖片,已經用掉20MB記憶體了,這個時候終於恍然大悟,圖片載入到記憶體中顯示,和儲存大小完全是兩個概念,因為現在無論什麼格式的圖片,幾乎都實現了很大的壓縮。而在伺服器端開發的時候,基本沒有考慮過圖片顯示的時候需要的記憶體大小,只需要傳給瀏覽器,怎麼顯示都是客戶端的問題了。
因為這個原因,LRUCache的命中非常低,幾乎無用了,然後,DiskLRUCache在併發訪問過大時,特別是有很多寫入請求的時候,會特別卡。所以,你需要根據你的imageView大小來控制載入到記憶體中的圖片大小;

ok,上面講到的都是自己在實現載入圖片的過程中遇到的一些問題。接下來,給新手們介紹一個開源圖片載入神器Android-Universal-Image-Loader。如果你一開始用的就是它來實現載入圖片,上面所有問題幾乎都不會遇到。因為這個元件全部幫你搞定了,包括網路請求,快取,圖片大小自適應,圖片釋放等等問題;
但對於初學者而言,我還是推薦大家按照Android高效載入大圖、多圖解決方案,有效避免程式OOM這篇文章學習並自己先實現下圖片載入和快取處理,結合DDMS等記憶體分析工具排查這個過程遇到的問題,可以幫助你深入的理解android圖片處理這一塊的細節實現。

最後,再給大家推薦一個非常棒的圖片

輪播元件
這裡寫圖片描述
效果非常炫,不過我下載的版本存在一個問題,它預設使用的picasso作為圖片載入和快取的元件,但在使用過程中發現這個元件吃記憶體比較嚴重,找了很久無法解決問題。最後只能自己修改原始碼,把用到picasso的地方用Universal-Image-Loader替代了之後,記憶體開銷恢復了正常水平。(其中一個重要原因是整個APP使用Universal-Image-Loader統一了快取的管理)。
好了,關於圖片的一些細節就介紹到這裡,最後還是推銷下自己開發的APP,有興趣的同學也可以去豌豆莢搜尋“布板”或掃描二維碼下載android的demo版試用看看,歡迎小夥伴們和我一起討論交流。
這裡寫圖片描述