简单记录下glide的缓存机制

匿名 (未验证) 提交于 2019-12-03 00:25:02

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带来的性能损耗.
简单记录下部分原理,具体详情待下一步来完善.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!