android避免decodeResource图片时占用太大的内存

尽量不要使用setImageBitmap或setImageResource或BitmapFactory.decodeResource来设置一张大图,因为这些函数在完成decode后,最终都是通过java层的createBitmap来完成的,需要消耗更多内存。 
因此,改用先通过BitmapFactory.decodeStream方法,创建出一个bitmap,再将其设为ImageView的source,decodeStream最大的秘密在于其直接调用JNI>>nativeDecodeAsset()来完成decode,无需再使用java层的createBitmap,从而节省了java层的空间。

如果在读取时加上图片的Config参数,可以跟有效减少加载的内存,从而跟有效阻止抛out of Memory异常

我们知道调用BitmapFactory.decodeResource时,如果手机屏幕的密度很大时,如果只是在hdpi放了图片, decode出来的bitmap会自动的scale放大。 而且如果按照ARGB_8888模式decode的话一个像素需要4个字节,这样343*433分辨率的图片decode大概会占用2M多内存。

 

//解决加载图片 内存溢出的问题 
//Options 只保存图片尺寸大小,不保存图片到内存 
   BitmapFactory.Options opts = new BitmapFactory.Options(); 
 //缩放的比例,缩放是很难按准备的比例进行缩放的,其值表明缩放的倍数,SDK中建议其值是2的指数值,值越大会导致图片不清晰 
    opts.inSampleSize = 4; 
    Bitmap bmp = null; 
     bmp = BitmapFactory.decodeResource(getResources(), mImageIds[position],opts);                             
                ...              
   //回收 
   bmp.recycle(); 

/**
 * 以最省内存的方式读取本地资源的图片
 * @param context
 * @param resId
 * @return
 */
fun readBitMap(context: Context, resId: Int): Bitmap {
    var opt = BitmapFactory.Options()
    opt.inPreferredConfig = Bitmap.Config.RGB_565
    opt.inPurgeable = true
    opt.inInputShareable = true
    //获取资源图片
    var inputStream = context.resources.openRawResource(resId)
    return BitmapFactory.decodeStream(inputStream, null, opt)
}

你可能感兴趣的:(Android,问题)