首先我通常使用的適配器是BaseAdapter,其中有兩個方法最主要,分別是: getCount,getView,
在對Listview 進行優化的時候,首先使用 convertview 和viewHolder 配合進行優化,使用convertview的母的是
控件複用,從而加到減小內存的使用,使用viewHolder 的是減小findbyid 的次數.
可是在進行控件之後,在進行圖片加載的時候,會出現圖片錯位的問題,這是由於控件裏面有上次殘留的圖片在裏面,因此咱們在初始化的時候須要設置一張默認圖,清楚上次殘留的圖片,從而避免圖片錯位.
注意: 在進行圖片加載的時候通常會形成 OOM(內存溢出),這個時候咱們須要用到三級緩存策略,來進行處理,
首先三級緩存分別是:
1:強引用(Lrucache)
2:軟引用(
SoftRenfence)
3:SD卡(如今被 DisKLrucache)
首先當咱們須要加載圖片的時候:
首先從強引用裏面找,若是強引用沒有,就從軟引用裏面找,若是軟引用沒有就從SD卡里面找,若是SD卡沒有就從網絡加載,經過加載請求到的圖片存入到強引用(Lrucache)裏面.
第二:強引用通常取內存的四分之一,當強引用滿了之後,就經過Lrucache 算法講部分圖片刪除,同時存入到軟引用裏面,當軟引用滿了,就將部分圖片存入到SD卡里面,當SD卡滿了,就將一半的刪除,(刪除的時候根據使用日期排序),
注意:強引用是不能被垃圾回收機制回收的,軟引用是能夠隨時被垃圾回收機制回收的.
:一半狀況下咱們加載的圖片的 url,是服務器通過二次採樣之後的url,只有當點擊看大圖的時候才加載原圖.
:不管在強引用,軟引用仍是SD卡咱們存圖片的時候都是以鍵值對的形式存的,他的鍵就是url,通常狀況下使用MD5對URL進行加密,這樣作的目的是爲了不URL 裏面有非法字符.
二次採樣:
注意:二次採樣分兩部進行,首先第一步咱們須要獲取圖片的寬和高,同時獲取到須要採樣後的寬和高,經過寬和高計算出咱們須要的採樣比,第二步:經過採樣比讓咱們的圖片真正實現採樣縮放.
案例以下:
第一步:
假如說我有一張圖片是200*200,那麼我想把這張圖片的縮略圖顯示在一個50*50的ImageView上,那個人壓縮比例應該爲4,(這就是咱們第一步的操做了,我先加載圖片的邊界到內存中,這個加載操做並不會耗費多少內存)
第二步:
在第一次採樣的基礎上,我來進行二次採樣。二次採樣的時候,我把第一次採樣後算出來的結果做爲一個參數傳遞給第BitmapFactory,這樣在加載圖片的時候系統就不會將整張圖片加載進來了,而是隻會加載該圖片的一張縮略圖進來,這樣不只提升了加載速率,並且也極大的節省了內存,並且對於用戶來講,他也不會有視覺上的差別
具體代碼如何實現:
第一次採樣:首先獲取new BitmapFactory.Options()獲取option對象, inJustDecodeBounds
設置爲true只會加載圖片的邊框進來,並不會加載圖片具體的像素點,經過BitmapFactory.decodeFile(filePath, options);來進行第一次加載圖片,經過outWidth原圖的寬度,經過outHeight獲取原圖的高,接下來經過控件的寬度和控件的高度來獲取一個採樣率sampleSize,接下來進行第二次採樣設置inJustDecodeBounds爲false,同時設置縮放比,設置inPreferredConfig的圖片的圖片格式有(分別爲ALPHA_8,RGB_565,ARGB_4444,ARGB_8888),最後進行圖片的加載.
具體實現代碼:
BitmapFactory.Options options = new BitmapFactory.Options();
// 第一次:設爲true時,僅僅獲得邊界,即寬高
options.inJustDecodeBounds=true;
Bitmap bitmap = BitmapFactory.decodeFile(file.getAbsolutePath(),options);
// 第二次:將options的值設爲Config.RGB_565,會比默認的Config.ARGB_8888減小一半內存;
options.inPreferredConfig= Bitmap.Config.RGB_565;
// 將邊框縮減到原來寬高的1/100;
options.inSampleSize=Math.max(options.outWidth,options.outHeight)/100;
// 設置爲false,表示不單單加載邊框,
options.inJustDecodeBounds=false;
bitmap=BitmapFactory.decodeFile(file.getAbsolutePath(),options)算法