关于universal-image-loader如何防止Bitmap OOM的说明

2016-09-01 23:14 阅读 2,923 次 评论 0 条
版权声明:本文著作权归TeachCourse所有,未经许可禁止转载,谢谢支持!
转载请注明出处:http://teachcourse.cn/2024.html

摘要

使用universal-image-loader图片加载框架出现OOMExceptionError错误,查看官网开发文档,在配置ImageLoaderConfiguration和DisplayImageOption时需要注意几个内容,推荐设置如下:

  1. ImageLoaderConfiguration confi=new ImageLoaderConfiguration.Builder(mContext)  
  2.                 .threadPoolSize()  
  3.         .memoryCacheExtraOptions(480800)  
  4.         .discCacheFileNameGenerator(new Md5FileNameGenerator())  
  5.         .threadPriority(Thread.NORM_PRIORITY - 2)  
  6.         .diskCacheExtraOptions(480320null)  
  7.         .denyCacheImageMultipleSizesInMemory()  
  8.         .memoryCache(new UsingFreqLimitedMemoryCache(2 * 1024 * 1024))  
  9.         .memoryCacheSize(2 * 1024 * 1024)  
  10.         .discCacheSize(50 * 1024 * 1024)  
  11.         .tasksProcessingOrder(QueueProcessingType.LIFO)  
  12.         .discCacheFileCount(100)  
  13.         .discCache(new UnlimitedDiskCache(cacheDir))  
  14.         .defaultDisplayImageOptions(DisplayImageOptions.createSimple())  
  15.         .imageDownloader(new BaseImageDownloader(context, 5 * 100030 * 1000))  
  16.         .build();  

OOMExceptionError

.threadPoolSize()减少线程池的线程数量,推荐线程数1~5;.diskCacheExtraOptions()推荐设置480,320,null;

下面是DisplayImageOptions的配置说明

  1. DisplayImageOptions options = new DisplayImageOptions.Builder()  
  2.                 .bitmapConfig(Bitmap.Config.RGB_565)  
  3.         .showImageOnLoading(R.drawable.default_bg)  
  4.         .showImageForEmptyUri(R.drawable.default_bg)  
  5.         .showImageOnFail(R.drawable.default_bg).cacheInMemory(true)  
  6.         .cacheOnDisc(true).considerExifParams(false)  
  7.         .imageScaleType(ImageScaleType.EXACTLY).delayBeforeLoading(0)  
  8.         .resetViewBeforeLoading(false)  
  9.         .considerExifParams(false).build();  

exact-image

.bitmapConfig()推荐使用Bitmap.Config.RGB_565,RGB_565比ARGB_8888节省内存消耗;.imageScaleType()推荐设置ImageScaleType.EXACTLY,图片的大小刚好满足控件尺寸;

更加详细的信息可以参考universal-image-loader官网说明。怎么定义一个Bitmap大小刚好符合ImageView控件的大小呢?文档说明推荐

第一步:获取ImageView控件测量真实的宽高

第二步:获取控件ImageView设置的layout_width、layout_height参数值

第三步:获取控件ImageView设置的maxWidth、maxHeight参数值

第四步:根据ImageLoaderConfiguration配置的.memoryCacheExtraOptions()参数获取最大的宽和高

第五步:获取当前屏幕的宽和高

如果设置了上述参数值,有助于计算当前View需要的Bitmap的大小并保存到缓存,Bitmap越小,消耗的内存也相当较小,有效防止Bitmap一直占用大量内存而出现OOMExceptionError。universal-image-loader如何防止OOM的原理是一样的,通常我们又是如何做的呢?

Bitmap防止出现 OOM 办法一

由于Bitmap是加载到内存进行操作的,所以第一种解决OOM的办法就是尽可能减小加载的内存中的Bitmap大小,减小Bitmap大小的方式:第一压缩图片质量,第二压缩图片比例,第三限制图片字节数。如果没有阅读过《关于Bitmap位图压缩图片的三种方式》的朋友可以先了解一下,里面介绍的三种图片压缩的方式刚好有效减小加载到内存的Bitmap大小,一定程度上减少OOMExceptionError的occur,但还不能完全解决。

Bitmap防止出现 OOM 办法二

第二种解决OOM的办法是即时回收Bitmap占用的内存,回收的方法流程当前Bitmap对象不为null并且没有被回收时,对象调用recycle()方法回收Bitmap占用的内存资源,并且将Bitmap对像置空。

  1. if(bitmap != null && !bitmap.isRecycled()){  
  2.     bitmap.recycle();  
  3.     bitmap = null;  
  4. }  
关注公众号 扫一扫二维码,加我QQ

如果文章对你有帮助,欢迎点击上方按钮关注作者

来源:TeachCourse每周一次,深入学习Android教程,关注(QQ1589359239或公众号TeachCourse)
转载请注明出处:http://teachcourse.cn/2024.html
分类:Android 标签:,
Android 开发之深入理解安卓调试桥各种错误解决办法 Android 开发之深入理解安卓调试
浅谈char、varchar和nvarchar的区别 浅谈char、varchar和nvarchar的区
浅谈OptionMenu选项菜单 浅谈OptionMenu选项菜单
微信开放平台开发之闪退问题解决办法 微信开放平台开发之闪退问题解决

发表评论

呲牙 憨笑 坏笑 偷笑 色 微笑 抓狂 睡觉 酷 流汗 鼓掌 大哭 可怜 疑问 晕 惊讶 得意 尴尬 发怒 奋斗 衰 骷髅 啤酒 吃饭 礼物 强 弱 握手 OK NO 勾引 拳头 差劲 爱你

表情