摘要
使用universal-image-loader图片加载框架出现OOMExceptionError错误,查看官网开发文档,在配置ImageLoaderConfiguration和DisplayImageOption时需要注意几个内容,推荐设置如下:
- ImageLoaderConfiguration confi=new ImageLoaderConfiguration.Builder(mContext)
- .threadPoolSize()
- .memoryCacheExtraOptions(480, 800)
- .discCacheFileNameGenerator(new Md5FileNameGenerator())
- .threadPriority(Thread.NORM_PRIORITY - 2)
- .diskCacheExtraOptions(480, 320, null)
- .denyCacheImageMultipleSizesInMemory()
- .memoryCache(new UsingFreqLimitedMemoryCache(2 * 1024 * 1024))
- .memoryCacheSize(2 * 1024 * 1024)
- .discCacheSize(50 * 1024 * 1024)
- .tasksProcessingOrder(QueueProcessingType.LIFO)
- .discCacheFileCount(100)
- .discCache(new UnlimitedDiskCache(cacheDir))
- .defaultDisplayImageOptions(DisplayImageOptions.createSimple())
- .imageDownloader(new BaseImageDownloader(context, 5 * 1000, 30 * 1000))
- .build();
.threadPoolSize()减少线程池的线程数量,推荐线程数1~5;.diskCacheExtraOptions()推荐设置480,320,null;
下面是DisplayImageOptions的配置说明
- DisplayImageOptions options = new DisplayImageOptions.Builder()
- .bitmapConfig(Bitmap.Config.RGB_565)
- .showImageOnLoading(R.drawable.default_bg)
- .showImageForEmptyUri(R.drawable.default_bg)
- .showImageOnFail(R.drawable.default_bg).cacheInMemory(true)
- .cacheOnDisc(true).considerExifParams(false)
- .imageScaleType(ImageScaleType.EXACTLY).delayBeforeLoading(0)
- .resetViewBeforeLoading(false)
- .considerExifParams(false).build();
.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对像置空。
- if(bitmap != null && !bitmap.isRecycled()){
- bitmap.recycle();
- bitmap = null;
- }
你可能感兴趣的文章
转载请注明出处: https://www.teachcourse.cn/2024.html ,谢谢支持!