Bitmap 延申笔记

21 阅读1分钟

Bitmap复用:

Glide中的策略:

options.inBitmap = bitmapPool.getDirty(width, height, expectedConfig);

如果设置了inBitmap。则用了这个options对象decode方法在decode时会尝试复用传入的bitmap。被复用的bitmap必须是可修改的,options.inMutable = true

4.4以后,BitmapFactory可以复用支持修改的getAllocationByteCount()大于等于decode的getByteCount()的bitmap

4.4之前的只支持jpg或png格式,复用bitmap和decode的bitmap大小一致,并且inSampleSize = 1,复用的config将覆盖inPreferredConfig

  // LruBitmapPool
  public Bitmap getDirty(int width, int height, Bitmap.Config config) {
  // 优先获取
  Bitmap result = getDirtyOrNull(width, height, config);
  if (result == null) { // 若没有,新建一个bitmap
  result = createBitmap(width, height, config);
  }
  return result;
  }

1.这里Glide采用了策略模式(好的框架在架构上有多设计值得学习) 低版本采用宽,高,config匹配,高版本采用size,config匹配

2.inBitmap返回异常会调用decodeStream加载,降级处理,避免异常

3.glide会根据控件大小缩放进一步节省内存,避免过度申请

Api26之前bitmap是基于java gc机制,之后是基于native finalizer

inMutable

设置了,decode方法返回一个可修改的bitmap,不能与inpreferredConfig设为config HARDWARE(硬件加速)一同设置。

inPreferredConfig

设置图片首选的解码格式,不一定最终结果

getByteCount()

返回可用于存储此bitmap像素的最小字节

getAllocationByteCount()

存储此bitmap像素已分配的内存大小,此方法返回值比 getByteCount()大有2种情况,第一种:使用了bitmap的复用,并且解码的bitmap比被复用的bitmap大小要小;第二种:手动修改了一些配置