Android Listview 效能最佳化

來源:互聯網
上載者:User

標籤:問題   tco   count   oom   ons   索引值   err   actor   一半   

首先我一般使用的適配器是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)

Android Listview 效能最佳化

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.