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大小要小;第二种:手动修改了一些配置