图片下载框架概述

460 阅读1分钟

图片下载需要解决(考虑)哪些问题?

内存缓存

  • FIFO双向队列+LRU双向队列+map数据结构。可以参考LKImageKit。

本地缓存

  • 存储解码前的。解码后占用空间太大;
  • 异步IO线程读取本地图片数据,sdWebImage解码是在异步单线程中,当瞬时加载大量图片时,可能会是性能瓶颈。可以尝试在多个线程进行解码。

合并请求

  • 确保一张图片不会请求多次
  • sdWebImage中,一个下载对应一个operation。多次重复请求时,添加多个block。

取消请求

  • 可以只删除对应回调block。下载,解码,保存内存缓存,保存磁盘缓存照样继续进行。(快速滑动列表时,很大概率会再划过来)。
  • 取消下载等操作。(一个下载operation,没有对应回调时直接cancle).
  • 提供两种方案,根据不同业务形态进行选择。

主流图片格式解码方案?

  • 子线程解码。SDWebImage使用串行队列进行解码。估计是为了实时下载,解码,显示(这种场景下,如果使用并发队列,顺序可能乱掉)这里应该可以优化。
  • 如果只是下载结束后解码,可以考虑使用异步多线程解码。
  • 解码格式主要有: Png/jpeg/webP等。 SDWebImage有对应解码模块。
  • GIF:使用FLAnimatedImage

渐进式加载

  • 可以逐行加载 或 模糊到清晰的加载,
  • 参考sdwebImage。个人感觉从模糊到清晰的用户体验更好。
  • 具体实施时,可以调研下主流APP是否渐进显示。

极致优化

参考框架