本文作者:Zhang Phil
原文链接:
http://blog.csdn.net/zhangphil/article/details/48130053



Android加载大图Bitmap发生OOM(Out Of Memmory Error)解决方案

Android的内存管理机制对Bitmap比较敏感,并且Android对Bitmap的操作是基于native方法,当在应用中加载过大的Bitmap时候,很容易造成Android OOM(Out Of Memmory) Error,进而导致整个APP崩溃,调试还十分困难。
Android OOM Error如图所示:

Android加载大图Bitmap发生OOM(Out Of Memmory Error)解决方案_第1张图片


对于Android OOM解决方案有很多种,最简单、最便于实施的就是在加载过大Bitmap时候进行压缩,主要是通过设置BitmapFactory.Options的inSampleSize值进行压缩,假设inSampleSize=3,那么,就是说我告知BitmapFactory将原始图片资源缩小到原大小的三分之一。
Java代码所示:

publicstaticBitmap getBitmapNonOOM(Context context, int resId){BitmapFactory.Options options = new BitmapFactory.Options();//设置此参数后,将不会把图片载入内存不会分配内存,而只读取图片的基础信息如宽、高。//options.inJustDecodeBounds = true;//BitmapFactory.decodeResource(context.getResources(), resId, options);//int imageHeight = options.outHeight;//int imageWidth = options.outWidth;//将原图缩小3倍options.inSampleSize = 3;Bitmap bmp = BitmapFactory.decodeResource(context.getResources(), resId,options);returnbmp;}

正如上述代码中注释掉的那部分代码,

//设置此参数后,将不会把图片载入内存不会分配内存,而只读取图片的基础信息如宽、高。//options.inJustDecodeBounds = true;//BitmapFactory.decodeResource(context.getResources(), resId, options);//int imageHeight = options.outHeight;//int imageWidth = options.outWidth;


如果加载一个Android图片资源目的仅仅只是为了获取该图片资源的宽高等基础信息,那就没必要将这个图片载入内存,要知道,一旦载入内存,就要带来不小的性能开销,因此,可以对图片资源进行“预处理”,设置BitmapFactory.Options的参数:
options.inJustDecodeBounds = true;

告知BitmapFactory,不要将该图片载入内存,仅仅只需预处理然后返回该图片资源的基础信息如宽高等即可。



更多相关文章

  1. 演化理解 Android 异步加载图片
  2. Android布局的一些属性和开关、创建log图片
  3. Android WebView实现选择本地图片拍照功能
  4. android保存文件到手机内存
  5. 很实用的android压缩图片的算法
  6. Android黑科技动态加载(四)之动态启动插件Activity
  7. 巧解Android时区加载过慢的问题
  8. android imageView 图片显示方式属性
  9. android的异步加载与UI

随机推荐

  1. Android关于触摸事件跟点击事件两个方法
  2. android UI定制的一些资料
  3. TL-android通过USB使用真机调试程序
  4. Android的animation
  5. Android(安卓)call requires API level解
  6. android aidl接口初步了解
  7. Android FileProvider
  8. Android模仿Buttonbar
  9. Android文件上传
  10. Android 常用mimetype类型