打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
Bitmap的生成流程之BitmapFactory.decodeResource VS BitmapFactory.decodeStream
分类: Android 2012-10-04 16:52 4551人阅读 评论(4) 收藏 举报
       BitmapFactory.decodeResource和BitmapFactory.decodeStream,相信对于有过android app开发经验的人来说都是很熟悉了。关于Bitmap的OOM问题,网上也有很多文章进行了分析,不少文章都说为避免OOM,最好使用BitmapFactory.decodeStream,但是具体说明原因的我至今没有找到,所以趁着10.1期间有空,就调查了一番,希望结果对大家能有帮助。

      先来张时序图,看了这张图,估计很多问题都不用说明了:



下面做些说明:

1,函数externalBytesAvailable(...)的内存计算方法详细请参见文章《Android Bitmap内存限制》;

2,Bitmap.createScaledBitmap时可能会对Bitmap进行缩放,缩放所使用的Options请参见下面这段代码:

  1. public static Bitmap decodeResourceStream(Resources res, TypedValue value,  
  2.         InputStream is, Rect pad, Options opts) {  
  3.   
  4.     if (opts == null) {  
  5.         opts = new Options();  
  6.     }  
  7.   
  8.     if (opts.inDensity == 0 && value != null) {  
  9.         final int density = value.density;  
  10.         if (density == TypedValue.DENSITY_DEFAULT) {  
  11.             opts.inDensity = DisplayMetrics.DENSITY_DEFAULT;  
  12.         } else if (density != TypedValue.DENSITY_NONE) {  
  13.             opts.inDensity = density;  
  14.         }  
  15.     }  
  16.       
  17.     if (opts.inTargetDensity == 0 && res != null) {  
  18.         opts.inTargetDensity = res.getDisplayMetrics().densityDpi;  
  19.     }  
  20.       
  21.     return decodeStream(is, pad, opts);  
  22. }  
当放大时,会加大造成OOM的可能性;
3,BitmapFactory.decodeResource比起BitmapFactory.decodeStream来说,在没有参数Options opts的情况下,确实是多占用了内存,因为多了BitmapFactory.finishDecode这一步,这里多了一个Bitmap.createScaledBitmap操作;

4,关于使用BitmapFactory.decodeResource和BitmapFactory.decodeStream的效率对比,大家可以参见文章《Android 内存优化测试

5,关于文章《Android 内存优化测试》提到的使用BitmapDrawable是最节省内存的方法,原因是frameworks\base\core\java\android\content\res\Resources.java对Bitmap做了缓存处理,文中所有的array其实都是指向同一个Bitmap,这一点也可以通过Bitmap.toString的输出信息来证明。

备注:时序图看不清楚的,可以到http://download.csdn.net/detail/imyfriend/4617329下载原图。

0
0
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
BitmapFactory.decodeResource加载图片缩小的原因及解决方法
Android 内存优化测试
如何解决加载大图片时内存溢出的问题
Android加载图片致使内存溢出(Out of Memory异常)
07.Android之多媒体问题
Android Bitmap和Canvas笔记
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服