android bitmap设置图片内存溢出的解决神器

/**
          * 以最省内存的方式读取本地资源的图片
          * @param context
          *@param resId
          * @return
          */  
    public static Bitmap readBitMap(Context context, int resId){  
        BitmapFactory.Options opt = new BitmapFactory.Options();  
        opt.inPreferredConfig = Bitmap.Config.RGB_565;   
       opt.inPurgeable = true;  
       opt.inInputShareable = true;  
          //获取资源图片  
       InputStream is = context.getResources().openRawResource(resId);  
           return BitmapFactory.decodeStream(is,null,opt);  
    }

  guideImg.setImageBitmap(readBitMap(getActivity(),mGuideDocters[positionNumber]));

取得bitmap之后,再imageview.setImageBitmap(readBitmap); 就ok了! 

就这么几行代码,解决内存溢出,加载引导界面的图片特别大,以前是80M,因为引导界面的缘故,每增加一张图片内存飙升30M,并且viewpager引导界面会预加载左右一张,所以极容易内存溢出,但是使用这种加载方法之后,滑动引导界面内存几乎没什么变化。

 因为imageView.setBackgroundResource,imageView.setImageResource 或者 BitmapFactory.decodeResource设置一张图片的话,会调用java层的createBitmap来完成的,需要消耗更多的内存,

因此,改用先通过BitmapFactory.decodeStream方法,创建出一个bitmap,再将其设为ImageView的 source,decodeStream最大的秘密在于其直接调用JNI>>nativeDecodeAsset()来完成decode,无需再使用java层的createBitmap,从而节省了java层的空间。如果在读取时加上图片的Config参数,可以跟有效减少加载的内存,从而跟有效阻止抛out of Memory异常。

        另外,需要特别注意: 

         decodeStream是直接读取图片资料的字节码了, 不会根据机器的各种分辨率来自动适应,使用了decodeStream之后,需要在hdpi和mdpi,ldpi中配置相应的图片资源,否则在不同分辨率机器上都是同样大小(像素点数量),显示出来的大小就不对了


另附一个比较全的内存溢出博客链接:比较全面的内存溢出解决方案


猜你喜欢

转载自blog.csdn.net/u013634213/article/details/50970706