解決Bitmap導致的內存溢出問題

最近在做一個手機筆記本,遇到添加大量的本地圖片到GridView以及經常切換到多圖片的Activity,出現OOM的問題,現在總結一下解決的辦法。

首先OOM出現的原因很大程度上是很多Bitmap對象的使用沒有進行內存是釋放,另一個是Activity內加載的圖片過大,導致佔用的內存超出了系統分配給每個應用程序的上限。這樣的直接後果就是,軟件在使用着的時候會越來越卡,然後沒有任何提示就退出了。而解決這樣的問題就可以根據原因來逐個擊破了。

1、內存的釋放,定義的Bitmap對象爲成員變量的話,在Activity的onDestory()方法應該進行相應的內存釋放,並提醒系統進行垃圾回收(雖然JVM會自動垃圾回收,但做到這一步更加保險)。

if(bitmap!=null && !bitmap.isRecycled()){
bitmap.recycle();
bitmap = null;
}
System.gc();
2、如果加載的圖片比較大,而且是通過BitmapFactory.decodeFile()等方式加載的圖片資源,應該採用圖片縮放的方式對圖片進行壓縮處理。BitmapFactory有個options參數可以在加載圖片的時候設置縮放的比例

(1)設置options.inJustDecodeBounds爲true,獲取到outHeight(圖片的原始高度)和outWidth()(圖片的原始寬度)

· (2)計算inSampleSize的值,這個爲縮放值,例如2表示縮小爲原來的1/2,該值可以通過直接設置或者自己通過計算按一定的比例得到

BitmapFactory.options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
int scale = (int)(options.outHeight/(float)200);//我們只用高度或寬度計算均可
if(scale<=0){
scale = 1}
options.inSampleSize = scale;
Bitmap bitmap = BitmapFactory.decodeFile(path,options);

3、如果在要加載很多bitmap的場合,我們也可以讓Bitmap數維持在一個值內,超出這個值後將前面的先回收內存。例如我們可以將bitmap對象創建的時加入一個List,當List.size()超過8的話,就將第一個bitmaph回收。

4、ListView等組件使用網絡圖像的時候,我們可以將圖片下載到本地保存成file,判斷本地沒有該圖片再從網絡上異步下載。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章