1. 程式人生 > >Android高效加載大圖、多圖解決方案,有效避免程序OOM

Android高效加載大圖、多圖解決方案,有效避免程序OOM

view idv alc ash ces cal android手機 ons 多圖

前言:Android手機分配給給個應用的內存空間都是有限的,當圖片像素>屏幕像素時,會造成內存浪費,嚴重時更會造成oom,當圖片像素<屏幕像素時,又會導致展示出來的圖片失真,因此一個好的圖片框架應該解決內存分配的問題。

一般做法:

public static Bitmap decodeSampledBitmapFromResource(Resources res, int resId,
        int reqWidth, int reqHeight) {
    // 第一次解析將inJustDecodeBounds設置為true,來獲取圖片大小
    final BitmapFactory.Options options = new
BitmapFactory.Options(); options.inJustDecodeBounds = true; BitmapFactory.decodeResource(res, resId, options); // 調用上面定義的方法計算inSampleSize值 options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight); // 使用獲取到的inSampleSize值再次解析圖片 options.inJustDecodeBounds = false;
return BitmapFactory.decodeResource(res, resId, options); }

1.先將BitmapFactory.option.inJustDecodeBounds = true,這樣只會加載圖片的寬高等信息,並不會將圖片加載進內存。

2.根據imageview控件的大小和圖片大小計算出比例關系inSampleSize,並設置給options.inSample

3.將options.inJustDecodeBounds = false,再重新加載圖片,這下加載的圖片就是壓縮之後的圖片。

還有一種情況,在listview或者gridview中加載大量圖片時,都會去訪問網絡,這樣也是會影響性能的,因此使用LruCache(最近最少使用原則)可以把一些重要的圖片資源加載到內存中(LinkedHashMap),可以解決重復訪問網絡的問題。

Android高效加載大圖、多圖解決方案,有效避免程序OOM