android 图片加载,OOM 问题
首先处理这个问题,用了1个星期,非常努力,拼命的寻找哪里出现了OOM 内存溢出的问题,可是都没找到结果,一直以为是自己使用的Picaso加载图片框架,只加载了图片,但是activity 销毁时,没有做内存释放的功能,所以自己去尝试方法去解决问题:
1.换一个图片框架:Xutil 图片框架
结果只是换汤不换药。 还是会出现OOM ,内存溢出问题
2.图片单独处理:网上说针对于大图,要做缩放处理,并对生成的BitMap 对象进行内存处理
private void initDisplayImageOption(){ options = new DisplayImageOptions.Builder() .showImageOnLoading(R.drawable.video_default) //设置图片在下载期间显示的图片 .showImageForEmptyUri(R.drawable.image_background_empty) //设置图片Uri为空或是错误的时候显示的图片 //.showImageOnFail(R.drawable.image_background_erro) //设置图片加载/解码过程中错误时候显示的图片 .cacheInMemory(false) //设置下载的图片是否缓存在内存中 .cacheOnDisk(true) //设置下载的图片是否缓存在SD卡中 .considerExifParams(true) //是否考虑JPEG图像EXIF参数(旋转,翻转) .imageScaleType(ImageScaleType.EXACTLY_STRETCHED) //设置图片以如何的编码方式显示 .bitmapConfig(Bitmap.Config.RGB_565) //设置图片的解码类型// //.decodingOptions(android.graphics.BitmapFactory.Options decodingOptions) //设置图片的解码配置 .delayBeforeLoading(0) //int delayInMillis为你设置的下载前的延迟时间 .resetViewBeforeLoading(true)//设置图片在下载前是否重置,复位 .displayer(new FadeInBitmapDisplayer(100))//是否图片加载好后渐入的动画时间 .build();//构建完成 } @Override protected void onDestroy() { mam.popOneActivity(HostessDetailUI.this); Log.e("onDestroy() isRun!!!"); mHostessImgs.setAdapter(null); /**释放图片,控件图片引用资源*/ BitmapDrawable bitmapDrawable = (BitmapDrawable) mHostessMiddle.getBackground(); mHostessMiddle.setBackgroundResource(0); bitmapDrawable.setCallback(null); drawable.setCallback(null); Bitmap bitmap = bitmapDrawable.getBitmap(); if(bitmap != null && !bitmap.isRecycled()){ bitmap.recycle();//回收图片所占的内存 bitmap = null; } btp.recycle(); //回收图片所占的内存 System.gc(); super.onDestroy(); }
结果还是报oom问题,而且日志也没有看见GC操作,内存从16MB 跑到96MB 直接闪退,
3.换一种强大的图片框架:Universal-Image_loader(UIL)
看见网上说UIL是目前最流行,用户最多,个人配置最全的图片框架,于是乎自己换掉picaso,来到UIL的怀抱,可是还是报OOM问题,每次看日志都是跑到96MB闪退。
自己怀疑是自己对UIL理解不深,配置不全,还是没有释放内存。(有时间详细看下UIL源码实现)
4.换上最新的图片处理框架:Facebook 推荐的fresco 框架
dependencies { compile 'com.facebook.fresco:fresco:0.5.0+' }
因为这方面的讲解很少,自己看了一会儿,觉得好复杂,于是去看了一下官网文档在AS的使用介绍,简单的几个操作,加入到了自己的项目,没有像其他人说的要配置NDK,编译什么的。然后跑起来运行,果然!!内存堆没有在像以前那样到达96MB OOM问题了,真的是最新的东西会越好
5.去掉后台的大图,显示完整
程序不崩溃了,心里有很多的安慰,毕竟问题已经出现了1个星期了,然而还是有一些个别的图片很久都加载不出来,fresco框架这么好,为什么还是有图片加载不出来你。然后看日志 提示:加载图片太大,无法下载出来,于是看了下后台拉取的图片大小。纳尼。, 一张图片7MB!! 再完美的框架针对这种图片也是没办法的吧,所以让后台处理的图片规格。
最终解决办法:换上fresco框架+后台图片缩小处理。现在程序不会出现OOM问题了。好开心!(不过内存释放问题,自己还是没有做好,有待提高!)
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。