数据缓存
图片数据的起始位置是远端的 数据服务器 ,直到被加载到内存中才可以展示到客户端界面的View上。为了加快数据处理速度,需要在每一步对处理过的数据进行保存,再次需要时直接使用节省时间,是为缓存。
缓存策略
数据缓存需要提供合适的缓存策略,原因有二:
- 空间是有限的:APP分配到的内存大小和在文件系统中占据的空间大小依赖于操作系统的策略,都是有限的;
- 空间不足时,需要对现有的数据进行删除,数据被再次用到的几率和频次是不同的;
缓存分类
依据上面的图,按照缓存的位置不同可以分为下面几个:
- 网络缓存:也可以称为云缓存,一般需要从云服务运营商处购买服务,例如:CDN;
- 磁盘缓存:从云端下载文件到本地文件系统,保存在文件系统中;
- 内存缓存:数据在使用前需要加载到内存中,相对文件系统内存空间更小;
图中还有一个部分 客户端网络框架,通常网络框架也会提供文件系统缓存和内存缓存,但是他们本质上是在同一个APP运行实例中,内存和文件系统空间是共享的,没有必要同时使用,这里要注意做好处理。
缓存工具
下面每个部分都有一些工具,例如 BaseImageDownloader 和 BaseImageDecoder 在框架中起到重要的连接作用,同时也可以作为独立的工具类提供图片数据下载和加载服务。
文件缓存
加载到文件系统
-
BaseImageDownloader
Universal-image-loader提供 BaseImageDownloader 支持把多种数据来源的图片资源转存到缓存目录中:
private boolean downloadImage() throws IOException { // 获取数据流 InputStream is = getDownloader().getStream(uri, options.getExtraForDownloader()); if (is == null) { L.e(ERROR_NO_IMAGE_STREAM, memoryCacheKey); return false; } else { try { // 保存到缓存目录 return configuration.diskCache.save(uri, is, this); } finally { IoUtils.closeSilently(is)