android 图片加载,OOM 有关问题

android 图片加载,OOM 问题

android 图片加载,OOM 有关问题


android 图片加载,OOM 有关问题


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问题了。好开心!(不过内存释放问题,自己还是没有做好,有待提高!)