2019独角兽企业重金招聘Python工程师标准>>>

inBitmap是在BitmapFactory中的内部类Options的一个变量,简单而言,使用该变量可以复用旧的Bitmap的内存而不用重新分配以及销毁旧Bitmap,进而改善运行效率。

关于Bitmap的相关知识可以查看我写的Android中Bitmap的深入探讨总结。

inBitmap知识点

inBitmap变量是在Android 3.0+版本加入到系统源码当中,也就意味着inBitmap参数只有在Android 3.0+版本及以上能够正常使用,当你的app版本低于3.0的时候,还是老老实实的使用bitmap.recycle()进行Bitmap的回收操作;在Android 3.0+以上根据系统版本的不同,使用inBitmap的规则也不相同,具体区分如下:

  • 4.4之前的版本inBitmap只能够重用相同大小的Bitmap内存区域。简单而言,被重用的Bitmap需要与新的Bitmap规格完全一致,否则不能重用。
  • 4.4之后的版本系统不再限制旧Bitmap与新Bitmap的大小,只要保证旧Bitmap的大小是大于等于新Bitmap大小即可。

除上述规则之外,旧Bitmap必须是mutable的,这点也很好理解,如果一个Bitmap不支持修改,那么其内存自然也重用不了。Ok,关于inBitmap的知识点理论上也就那么多。Google为了帮助我们更好的管理Bitmap,也出了一个视频,视频地址如下:

https://www.youtube.com/watch?v=_ioFW3cyRV0&index=17&list=PLWz5rJ2EKKc9CBxr3BVjPTPoDPLdPIFCE

并且附带上了一个使用inBitmap的Demo:

https://developer.android.com/topic/performance/graphics/manage-memory.html#java

下面贴视频中两张图更好的帮助一下理解:

使用inBitmap之前:

使用inBitmap之后:

inBitmap的疑问

针对上述的理解,这里有一个疑问需要去确认一下:

  • inBitmap的解码模式跟新Bitmap的不同是否能够重用成功

解决这个疑问可以查看Google官方的inBitmap Demo来回答问题:


/*** candidate:旧的图片,targetOptions:新的图片的Options*/
private fun canUseForInBitmap(candidate: Bitmap, targetOptions: BitmapFactory.Options): Boolean {return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {// From Android 4.4 (KitKat) onward we can re-use if the byte size of// the new bitmap is smaller than the reusable bitmap candidate// allocation byte count.val width: Int = targetOptions.outWidth / targetOptions.inSampleSizeval height: Int = targetOptions.outHeight / targetOptions.inSampleSizeval byteCount: Int = width * height * getBytesPerPixel(candidate.config)byteCount <= candidate.allocationByteCount} else {// On earlier versions, the dimensions must match exactly and the inSampleSize must be 1candidate.width == targetOptions.outWidth&& candidate.height == targetOptions.outHeight&& targetOptions.inSampleSize == 1}
}/*** A helper function to return the byte usage per pixel of a bitmap based on its configuration.*/
private fun getBytesPerPixel(config: Bitmap.Config): Int {return when (config) {Bitmap.Config.ARGB_8888 -> 4Bitmap.Config.RGB_565, Bitmap.Config.ARGB_4444 -> 2Bitmap.Config.ALPHA_8 -> 1else -> 1}
}

这里可以看出,只要新的Bitmap的内存小于旧Bitmap的内存大小,即可进行复用的操作,那么跟解码模式没有必然的联系。

inBitmap的使用

关于inBitmap的使用,可以根据谷歌的官方例子进行设计和开发,不过维护起来需要一定的工作量。当然在市面上成熟的图片框架中,如Glide内部也使用了inBitmap作为缓存复用的一种方式。总而言之,根据项目以及业务来选择实现方式即可,不必过分纠结。

转载于:https://my.oschina.net/u/3863980/blog/3019921

关于Bitmap中的inBitmap变量的学习与使用相关推荐

  1. js 声明数组和向数组中添加对象变量 [前端学习 第七节]

    转载文章:http://blog.csdn.net/icanlove/article/details/40818559 数组有四种定义的方式  使用构造函数:  var a = new Array() ...

  2. java怎么给类中的私有变量赋值_Java学习笔记分享 如何理解接口抽象类和关键字...

    不知不觉中,千锋重庆学习Java已经半个月了,同学们感觉受益匪浅.有一个同学本来是软件编程专业基础却是意外的差,什么标识符.变量的命名规则.方法的定义.数组.面向对象的封装.继承.多态,还有接口.抽象 ...

  3. 【Linux学习笔记】27:环境变量中的语系变量

    语系就是用的是什么人类语言,本节专门学习环境变量中的语系变量. [1]locale确定系统当前语系 [root@bogon ~]# locale LANG=zh_CN.UTF-8 LC_CTYPE=& ...

  4. matlab中句点,matlab入门学习(一)

    今天是我第一天学习matlab软件,受教练嘱托,在雷神走之前一定要实现数学建模入门..先说说装软件吧,可真的是个蛋疼的问题,反正是装了 好久,装了一个云端版本的软件R2009a 的软件有点大1.4G哇 ...

  5. Ant build.xml中的各种变量

    http://blog.csdn.net/hittata/article/details/4744653 Ant环境变量分为四种: 1.      build.properties文件中定义的变量 2 ...

  6. 能否用痰盂盛饭——谈谈在头文件中定义外部变量

    能否用痰盂盛饭--谈谈在头文件中定义外部变量 - garbageMan - 博客园 能否用痰盂盛饭--谈谈在头文件中定义外部变量 "能否用痰盂盛饭"并非是一个技术问题,而是一个哲学 ...

  7. matlab静态变量怎样分配内存,matlab中的静态变量

    persistent X Y Z 将X,Y,Z定义为在其声明处的函数的局部变量.然而,这些变量的值在函数调用期间在内存中保存(应该是堆区).Persistent 变量和global(全局)变量相似,因 ...

  8. r中如何求变量的对数转换_对数转换以求阳性。

    r中如何求变量的对数转换 In Simple terms, log transform squashes or compresses range of large numbers and expand ...

  9. linux系统中变量,Linux系统中的环境变量知识详解

    对于没有使用过linux系统的用户来说,有很多术语和功能都很陌生.本文就介绍了linux系统中的环境变量的相关知识,具体内容如下所述. linux是一个多用户的操作系统.每个用户登录系统后,都会有一个 ...

最新文章

  1. 在pycharm中无法引入同一目录下的python文件
  2. 数十名工程师作战5天,阿里达摩院连夜研发智能疫情机器人
  3. 七夕福利 | 3D视觉从入门到精通系统学习教程
  4. MySQL性能优化(八)
  5. CEF(包含均衡负载)
  6. python定义方法self会被当作变量_为什么Python必须在方法定义和调用中显式使用“self”?...
  7. 【Nutch2.3基础教程】集成Nutch/Hadoop/Hbase/Solr构建搜索引擎:安装及运行【集群环境】
  8. LeetCode 646. 最长数对链(区间 贪心)
  9. RK3288 error: undefined reference to 'LOGD'
  10. 我读研期间通过实习和比赛收入五十万
  11. Urllib3 库详解
  12. MySQL 性能优化一
  13. HDU2030-汉字机内码
  14. unity简易游戏制作
  15. 模拟测试数据的生成方法
  16. 服务器系统开启telnet,Telnet怎么打开 Win7/Win8系统开启Telnet服务方法图解
  17. 丹佛机场行李系统案例分析
  18. Wox自制主题 - Material
  19. 2021全国职业技能大赛-网络安全赛题解析总结②(超详细)
  20. 打破次元壁,让游戏角色在指尖跳舞,简易的 AR 教程

热门文章

  1. netty java开发文档_《Netty官方文档》设置开发环境
  2. linux sh脚本 递增,Linux shell 脚本实现进度框
  3. axios获取header中的信息_Axios请求头中常见的Content-Type及其使用
  4. python异常处理操作语句_异常处理语句(2)
  5. linux系统怎么建ftp服务器地址,Ubuntu Linux系统建立FTP服务器方法步骤
  6. android 设计qq界面,[考试求助]仿照腾讯QQ应用软件,编写Android程序,登录界面设计...
  7. php consul 服务注册,CentOS 安装 Consul 服务注册和发现软件
  8. 操作系统饥饿现象_操作系统常见面试题
  9. image vb6 图片自适应_请问如何实现图片在窗体上的大小自适应?
  10. java公路车 superma_SuperMac80