通过源码可以了解到,加载Bitmap 到内存里以后,是包含两部
分内存区域的。简单的说,一部分是Java 部分的,一部分是C
部分的。这个Bitmap 对象是由Java 部分分配的,不用的时候
系统就会自动回收了


o 但是那个对应的C 可用的内存区域,虚拟机是不能直接回收
的,这个只能调用底层的功能释放。所以需要调用recycle()方
法来释放C 部分的内存


o bitmap.recycle()方法用于回收该Bitmap 所占用的内存,接着
将bitmap 置空,最后使用System.gc()调用一下系统的垃圾回
收器进行回收,调用System.gc()并不能保证立即开始进行回收
过程,而只是为了加快回收的到来。

一张Bitmap 所占内存以及内存占用的计算

Bitamp 所占内存大小 = 宽度像素 x (inTargetDensity /
inDensity) x 高度像素 x (inTargetDensity / inDensity)
x 一个像素所占的内存字节大小
 注:这里inDensity 表示目标图片的dpi(放在哪个资
源文件夹下),inTargetDensity 表示目标屏幕的dpi,
所以你可以发现inDensity 和inTargetDensity 会对
Bitmap 的宽高进行拉伸,进而改变Bitmap 占用内存的
大小。


o 在Bitmap 里有两个获取内存占用大小的方法。
getByteCount():API12 加入,代表存储 Bitmap 的
像素需要的最少内存。
getAllocationByteCount():API19 加入,代表在内
存中为 Bitmap 分配的内存大小,代替了
getByteCount() 方法。
 在不复用 Bitmap 时,getByteCount() 和
getAllocationByteCount 返回的结果是一样的。在通
过复用 Bitmap 来解码图片时,那么 getByteCount()
表示新解码图片占用内存的大 小,
getAllocationByteCount() 表示被复用 Bitmap 真实
占用的内存大小

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐