尽量不要使用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)}

更多相关文章

  1. MVP模式的Android(安卓)调用系统拍照,相册,剪裁,适配到7.0,修复拍照
  2. Glide 在Android(安卓)9.0上不显示图片
  3. android之基于Echart的图表
  4. 居中显示并旋转 android Button 里的属性drawableLeft
  5. android ListView中自定义SimpleAdapter动态添加ratingBar及图片
  6. Android(安卓)TextView加载HTMl图文之添加点击事件和查看图片
  7. Android之Bitmap 高效加载
  8. QuickSand图片点击后分裂成几份消失效果
  9. android 内存泄漏处理方式

随机推荐

  1. Android的网站资源收集大全
  2. Android(安卓)动画标签——rotate
  3. Android音频开发(7):音乐可视化-FFT频谱图
  4. Android(安卓)之 动画
  5. Android(安卓)多进程之Messenger的使用
  6. Android系统自带样式(@android:style/)
  7. 浅析Android手机卫士手机定位的原理
  8. Android音频开发(4):PCM转WAV格式音频
  9. Android(安卓)App更改背景颜色
  10. 【Android】Android(安卓)4.0 无法接收开