Android之Bitmap总结篇

1. Bitmap使用需要注意哪些问题 ?

  1. 要选择合适的图片规格(bitmap类型):通常我们优化 Bitmap 时,当需要做性能优化或者防止 OOM,我们 通常会使用 RGB_565,因为 :

    ALPHA_8 只有透明度,显示一般图片没有意义, Bitmap.Config.ARGB_4444 显示图片不清楚,
    Bitmap.Config.ARGB_8888 占用内存最多。:

    1. ALPHA_8 每个像素占用 1byte 内存
    2. ARGB_4444 每个像素占用 2byte 内存
    3. ARGB_8888 每个像素占用 4byte内存(默认)
    4. RGB_565 每个像素占用 2byte 内存
  2. 降低采样率:BitmapFactory.Options 参数 inSampleSize 的使用,

    先把 options.inJustDecodeBounds 设为 true,只是去读取图片的大小,
    在拿到图片的大小之后,和要显示的大小做比较,
    通过 calculateInSampleSize() 函数计算 inSampleSize 的具体值,
    得到值之后。 options.inJustDecodeBounds 设为 false 读图片资源。
    
  3. 复用内存:即通过软引用(内存不够的时候才会回收掉),复用内
    存块,不需要再重新给这个bitmap 申请一块新的内存,避免了
    一次内存的分配和回收,从而改善运行效率。

  4. 使用 recycle() 方法及时回收内存。

  5. 压缩图片。


2. Bitmap.recycle() 会立即回收么?什么时候会回收?如果没有地方使用这个 Bitmap,为什么垃圾回收不会直接回收?

  1. 通过源码可以了解到,加载 Bitmap 到内存里以后,是包含两部
    分内存区域的。简单的说,一部分是 Java 部分的,一部分是 C
    部分的。这个 Bitmap 对象是由 Java 部分分配的,不用的时候
    系统就会自动回收了;
  2. 但是那个对应的 C 可用的内存区域,虚拟机是不能直接回收
    的,这个只能调用底层的功能释放。所以需要调用 recycle() 方
    法来释放 C 部分的内存;
  3. bitmap.recycle() 方法用于回收该 Bitmap 所占用的内存,接着
    将 bitmap 置空,最后使用 System.gc() 调用一下系统的垃圾回
    收器进行回收,调用 System.gc() 并不能保证立即开始进行回收
    过程,而只是为了加快回收的到来。

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

  1. Bitamp 所占内存大小 = 宽度像素 x (inTargetDensity /
    inDensity) x 高度像素 x (inTargetDensity / inDensity)
    x 一个像素所占的内存字节大小
    1. 注:这里 inDensity 表示目标图片的 dpi(放在哪个资源文件夹下),inTargetDensity 表示目标屏幕的dpi,所以你可以发现 inDensity 和 inTargetDensity 会对 Bitmap 的宽高进行拉伸,进而改变 Bitmap 占用内存的大小。
  2. 在Bitmap 里有两个获取内存占用大小的方法。
    1. getByteCount():API12 加入,代表存储 Bitmap 的像素需要的最少内存。
    2. getAllocationByteCount():API19 加入,代表在内存中为 Bitmap 分配的内存大小,代替了 getByteCount() 方法。
    3. 在不复用 Bitmap 时,getByteCount() 和 getAllocationByteCount 返回的结果是一样的。
    4. 在通过复用 Bitmap 来解码图片时,那么 getByteCount() 表示新解码图片占用内存的大小,getAllocationByteCount() 表示被复用 Bitmap 真实占用的内存大小。

4. Android 中缓存更新策略 ?

  1. Android 的缓存更新策略没有统一的标准,一般来说,缓存策
    略主要包含缓存的添加、获取和删除这三类操作,但不管是内
    存缓存还是存储设备缓存,它们的缓存容量是有限制的,因此
    删除一些旧缓存并添加新缓存,如何定义缓存的新旧这就是一
    种策略,不同的策略就对应着不同的缓存算法;
  2. 比如可以简单地根据文件的最后修改时间来定义缓存的新旧,
    当缓存满时就将最后修改时间较早的缓存移除,这就是一种缓
    存算法,但不算很完美;

5. LRU 的原理 ?

为减少流量消耗,可采用缓存策略。常用的缓存算法是 LRU(Least Recently Used):当缓存满时, 会优先淘汰那些近期最少使用的缓存对象。主要是两种方式:

  1. LruCache(内存缓存):LruCache 类是一个线程安全的泛型类:内部采用一个LinkedHashMap 以强引用的方式存储外界的缓存对象,并提供 get 和 put 方法来完成缓存的获取和添加操作,当缓存满时会移除较早使用的缓存对象,再添加新的缓存对象。
  2. DiskLruCache(磁盘缓存): 通过将缓存对象写入文件系统从而实现缓存效果。

声明:本文整理自网络,如有侵权请联系。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

liusaisaiV1

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值