Android Bitmap inBitmap 图片复用

转载 2016年06月01日 18:21:21

主要就是指的复用内存块,不需要在重新给这个bitmap申请一块新的内存,避免了一次内存的分配和回收,从而改善了运行效率。

需要注意的是inBitmap只能在3.0以后使用。2.3上,bitmap的数据是存储在native的内存区域,并不是在Dalvik的内存堆上。

使用inBitmap,在4.4之前,只能重用相同大小的bitmap的内存区域,而4.4之后你可以重用任何bitmap的内存区域,只要这块内存比将要分配内存的bitmap大就可以。这里最好的方法就是使用LRUCache来缓存bitmap,后面来了新的bitmap,可以从cache中按照api版本找到最适合重用的bitmap,来重用它的内存区域。

Google官方文档已经给出了一个非常棒的教程Managing Bitmap Memory

另外非常推荐Google官方文档的这个系列 Displaying Bitmaps Efficiently 绝对帮你精通bitmap的操作。



inBitmap类似对象池的技术原理,避免内存的频繁的创建和销毁带来性能的损耗。使用inBitmap能高提升bitmap的循环效率。在Google发布的第二季性能优化都有提到inBitmap技术youtube.com/watch?(需翻墙)

使用inBitmap前,每创建一个bitmap需要独占一块内存
<img src="https://pic2.zhimg.com/e2dc7b46d2de25253a890f4603bf7659_b.png" data-rawwidth="859" data-rawheight="488" class="origin_image zh-lightbox-thumb" width="859" data-original="https://pic2.zhimg.com/e2dc7b46d2de25253a890f4603bf7659_r.png">
使用inBitmap后,多个bitmap会复用同一块内存
<img src="https://pic3.zhimg.com/67963f56caf572db533ee92104762a56_b.png" data-rawwidth="861" data-rawheight="509" class="origin_image zh-lightbox-thumb" width="861" data-original="https://pic3.zhimg.com/67963f56caf572db533ee92104762a56_r.png">
所以使用inBitmap能够大大提高内存的利用效率,但是它也有几个限制条件:
  1. 在SDK 11 -> 18之间,重用的bitmap大小必须是一致的,例如给inBitmap赋值的图片大小为100-100,那么新申请的bitmap必须也为100-100才能够被重用。从SDK 19开始,新申请的bitmap大小必须小于或者等于已经赋值过的bitmap大小。
  2. 新申请的bitmap与旧的bitmap必须有相同的解码格式,例如大家都是8888的,如果前面的bitmap是8888,那么就不能支持4444与565格式的bitmap了,不过可以通过创建一个包含多种典型可重用bitmap的对象池,这样后续的bitmap创建都能够找到合适的“模板”去进行重用。
     @hi大头鬼hi 提到 Managing Bitmap Memory 上的demo的DisplayingBitmaps.zip,代码也有用到inBitmap,我目前开发的项目的图片加载库就是DisplayingBitmaps,但是我把使用inBitmap的代码给注释掉了,因为之前遇到过不同的ImageView设置不同ScaleType,然后使用同一张图片会造成相互影响,设置图片圆角也是,所以这也是使用inBitmap要注意的地方。DisplayingBitmaps功能还是很弱,后面考虑替换faceboo的fresco或者Glide来进行图片加载。

相关文章推荐

Android的bitmap和优化

内存管理是个永恒的话题!    http://www.trinea.cn/android/android-performance-demo/ http://www.cnblogs.com/...

Android 那些你所不知道的Bitmap对象详解

我们知道Android系统分配给每个应用程序的内存是有限的,Bitmap作为消耗内存大户,我们对Bitmap的管理稍有不当就可能引发OutOfMemoryError,而Bitmap对象在不同的Andr...

inBitmap的用法

在android3.0开始,系统在BitmapFactory.Options里引入了inBitmap机制来配合缓存机制。如果在载入图片时传入了inBitmap那么载入的图片就是inBitmap里的值。...

Android -- 使用inBitmap要注意的地方

SDK版本 需要注意的是inBitmap只能在3.0以后使用。2.3上,bitmap的数据是存储在native的内存区域,并不是在Dalvik的内存堆上。   在android3.0开始,系统在...

Android 深入理解Android中的自定义属性

1、引言 对于自定义属性,大家肯定都不陌生,遵循以下几步,就可以实现: 自定义一个CustomView(extends View )类 编写values/attrs.xml,在其中编写styl...

Android Bitmap 重用

当加载相同尺寸大小的图片资源时,我们不必每次都create一个新的Bitmap,可以这样: 创建一个空的Bitmap作为cache,加载同尺寸时重用这个Bitmap. Bitmap...

android bitmap图片压缩

  • 2012-07-25 12:12
  • 30KB
  • 下载

Android 图片Bitmap保存到内存卡

一、什么是Android中的Bitmap Bitmap是Android系统中的图像处理的最重要类之一。用它可以获取图像文件信息,进行图像剪切、旋转、缩放等操作,并可以指定格式保存图像文件。 ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)