glide是目前非常流行和受欢迎的图片框架,这个框架从设计架构上看非常弹性,例如对文件格式的支持就是采用了注册的方式,
dataLoadProviderRegistry = new DataLoadProviderRegistry();
StreamBitmapDataLoadProvider streamBitmapLoadProvider =
new StreamBitmapDataLoadProvider(bitmapPool, decodeFormat);
dataLoadProviderRegistry.register(InputStream.class, Bitmap.class, streamBitmapLoadProvider);
FileDescriptorBitmapDataLoadProvider fileDescriptorLoadProvider =
new FileDescriptorBitmapDataLoadProvider(bitmapPool, decodeFormat);
dataLoadProviderRegistry.register(ParcelFileDescriptor.class, Bitmap.class, fileDescriptorLoadProvider);
对文件来源的形式也是采用的是注册形式:
register(File.class, ParcelFileDescriptor.class, new FileDescriptorFileLoader.Factory());
register(File.class, InputStream.class, new StreamFileLoader.Factory());
这就是一种插拔式的设计,实际项目使用中可以根据具体的需求来做裁剪或添加.
另一方面glide的在缓存设计上也很有独到的地方,其缓存大致可以分为:
(1) 基于LRU的LruResourceCache
(2) 基于使用活跃频率的存储:
Map<Key, WeakReference<EngineResource<?>>> activeResources
(3) 基于LRU的DiskLruCacheWrapper
(4) 最后才是发起网络请求从服务器获取文件;
在解析bitmap的过过程中还有个LruBitmapPool,通过这个bitmap池来存储不需要的bitmap,当需要解析新的bitmap时,直接从这个pool中来查找size符合需要的bitmap,复用bitmap,避免重复新建bitmap带来的性能损耗,bitmappool的类图如下:
简单记录下部分原理,具体详情待下一步来完善.