一、問題描述
Android應用中經常涉及從網絡中加載大量圖檔,為提升加載速度和效率,減少網絡流量都會采用二級緩存和異步加載機制,所謂二級緩存就是通過先從記憶體中擷取、再從檔案中擷取,最後才會通路網絡。記憶體緩存(一級)本質上是Map集合以key-value對的方式存儲圖檔的url和Bitmap資訊,由于記憶體緩存會造成堆記憶體洩露, 管理相對複雜一些,可采用第三方元件,對于有經驗的可自己編寫元件,而檔案緩存比較簡單通常自己封裝一下即可。下面就通過案例看如何實作網絡圖檔加載的優化。
二、案例介紹
案例新聞的清單圖檔
三、主要核心元件
下面先看看實作一級緩存(記憶體)、二級緩存(磁盤檔案)所編寫的元件
1、MemoryCache
在記憶體中存儲圖檔(一級緩存), 采用了1個map來緩存圖檔代碼如下:
?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 | |
2、FileCache
在磁盤中緩存圖檔(二級緩存),代碼如下
?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | |
3、編寫異步加載元件AsyncImageLoader
android中采用單線程模型即應用運作在UI主線程中,且Android又是實時作業系統要求及時響應否則出現ANR錯誤,是以對于耗時操作要求不能阻塞UI主線程,需要開啟一個線程處理(如本應用中的圖檔加載)并将線程放入隊列中,當運作完成後再通知UI主線程進行更改,同時移除任務——這就是異步任務,在android中實作異步可通過本系列一中所用到的AsyncTask或者使用thread+handler機制,在這裡是完全是通過代碼編寫實作的,這樣我們可以更清晰的看到異步通信的實作的本質,代碼如下
?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 | |
編寫完成之後,對于異步任務的執行隻需調用AsyncImageLoader中的loadBitmap()方法即可非常友善,對于AsyncImageLoader元件的代碼最好結合注釋好好了解一下,這樣對于Android中線程之間的異步通信就會有深刻的認識。
4、工具類ImageUtil
?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 | |
四、測試應用
元件之間的時序圖:
1、編寫MainActivity
?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | |
2、編寫擴充卡
?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 | |