一個簡單的Listview,然後裡面item就是一張圖檔,希望很流暢的加載網絡圖檔,然後滑動的時候不會出現卡頓,也不會出現OOM現象。在斷開網絡連接配接的時候,點選listview的item,進入到圖檔詳情界面,依舊能夠加載出完整的圖檔。這裡看一下效果圖:

截屏的時候有點卡頓,第一張是有網絡連接配接的時候加載的網絡圖檔,第二張是斷開網絡連接配接時點選item,進入圖檔詳情時加載的緩存圖檔。
這裡用到的是Universal-Image-Loader,一個強大的圖檔加載架構,具有以下的特性:
1.多線程下載下傳圖檔,圖檔可以來源于網絡,檔案系統,項目檔案夾assets中以及drawable中等
2.支援随意的配置ImageLoader,例如線程池,圖檔下載下傳器,記憶體緩存政策,硬碟緩存政策,圖檔顯示選項以及其他的一些配置
3.支援圖檔的記憶體緩存,檔案系統緩存或者SD卡緩存
4.支援圖檔下載下傳過程的監聽
5.根據控件(ImageView)的大小對Bitmap進行裁剪,減少Bitmap占用過多的記憶體
6.較好的控制圖檔的加載過程,例如暫停圖檔加載,重新開始加載圖檔,一般使用在ListView,GridView中,滑動過程中暫停加載圖檔,停止滑動的時候去加載圖檔
7.提供在較慢的網絡下對圖檔進行加載
界面布局很簡單,就不貼代碼了,具體看一下Universal-Image-Loader使用過程以及一些注意事項:
建立一個MyApplication繼承Application,Application是單例 (singleton)模式的一個類。且application對象的生命周期是整個程式中最長的,它的生命周期就等于這個程式的生命周期。因為它是全局的單例的,是以在不同的Activity,Service中獲得的對象都是同一個對象。是以通過Application來進行一些資料傳遞,資料共享等資料緩存等操作。在這裡我們來建立圖檔加載器ImageLoader的配置參數。
ImageLoaderConfiguration使用了建造者模式配置參數,設定了線程池中線程個數,記憶體存儲大小,數量,硬碟存儲大小,數量等參數。
最後調用ImageLoader.getInstance().init(config)将設定參數傳遞進去,這裡用的是單例模式–懶漢式雙重校驗鎖
參考資料:
<a href="http://blog.csdn.net/dmk877/article/details/50311791">http://blog.csdn.net/dmk877/article/details/50311791</a>
DisplayImageOptions用來配置圖檔顯示的選項,比如圖檔在加載中ImageView顯示的圖檔,加載失敗顯示的圖檔,是否需要使用記憶體緩存,是否需要使用檔案緩存等等。這裡都設定true,就不用每次都從網絡上加載圖檔。
看一下擴充卡代碼:
通過ViewHolder來優化listview,通過ImageLoader的異步加載圖檔,隻需要傳進去兩個參數,第一個是圖檔url,第二個是ImageView控件,ImageLoader會自動給我們緩存圖檔的,如果之前加載過了是不會再次下載下傳圖檔,直接加載本地緩存好的圖檔。
接下來就是activity中的運用:
其中需要注意的是:
Universal-Image-Loader提供了PauseOnScrollListener這個類來控制ListView,GridView滑動過程中停止去加載圖檔。第一個參數就是我們的圖檔加載對象ImageLoader, 第二個是控制是否在滑動過程中暫停加載圖檔,如果需要暫停傳true就行了,第三個參數控制猛的滑動界面的時候圖檔是否加載。
給每個item設定了點選事件,傳遞目前item的URL到圖檔詳情界面,這裡我故意斷開了網絡連接配接,最後依舊能夠得到緩存。看一下代碼:
拿到上一個界面傳遞過來的URL,調用的還是displayImage((String) data.get(“url”)這個方法,隻不過這次拿的是緩存,不再是從網絡上下載下傳的。
可以看到緩存都在自己定義的檔案夾下面。
緩存政策的流程就是:
每次加載圖檔的時候都優先去記憶體緩存當中讀取,當讀取不到的時候則回去硬碟緩存中讀取,而如果硬碟緩存仍然讀取不到的話,就從網絡上請求原始資料。
參考部落格:
<a href="http://blog.csdn.net/xiaanming/article/details/26810303">http://blog.csdn.net/xiaanming/article/details/26810303</a> <a href="http://blog.csdn.net/xiaanming/article/details/27525741">http://blog.csdn.net/xiaanming/article/details/27525741</a> <a href="http://blog.csdn.net/xiaanming/article/details/39057201">http://blog.csdn.net/xiaanming/article/details/39057201</a>