/**
* 以最省内存的方式读取本地资源的图片
* @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中配置相应的图片资源,否则在不同分辨率机器上都是同样大小(像素点数量),显示出来的大小就不对了
另附一个比较全的内存溢出博客链接:比较全面的内存溢出解决方案