Android开发中 页面加载一张超大图片时出现OOM

来源:互联网 发布:linux 命令结果 编辑:程序博客网 时间:2024/05/16 11:33

 

/**          * 以最省内存的方式读取本地资源的图片          * @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);      }


 

 

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


     那是为什么,会导致oom呢:

         原来当使用像 imageView.setBackgroundResource,imageView.setImageResource, 或者 BitmapFactory.decodeResource  这样的方法来设置一张大图片的时候,

         这些函数在完成decode后,最终都是通过java层的createBitmap来完成的,需要消耗更多内存。

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

原创粉丝点击