从设计到实现,一步步教你实现Android-Universal-ImageLoader-缓存

转载请标明出处,本文出自:chaossss的博客


Android-Universal-ImageLoader Github 地址


Cache

我们要对图片进行缓存,有两种方式:内存缓存和本地缓存。这两种方式的区别在于,内存缓存是缓存在 Android 系统为应用分配的运行内存之中,读取速度快,但是可能会带来 OOM 的问题;本地缓存一般缓存在 SD 卡中,读取速度较慢,但是缓存空间足。

那么我们要怎么来实现内存缓存和本地缓存呢?根据单一职责原则,如果 MemoryCache 和 DiskCache 的抽象不一致的话,我们就需要分别创建 MemoryCache 和 DiskCache 的抽象基类,分别实现各自的细节。而显然,两者抽象是不一致的,因为 MemoryCache 面对的对象是图片(Bitmap),DiskCache 面对的对象是文件(File)。因此,我们应该分开实现 MemoryCache 和 DiskCache。

MemoryCache

MemoryCache 整体设计及相关基类的实现

那我们现在该干啥呢?想 MemoryCache 的功能啊!对于进行内存缓存我们能想到什么应用场景呢:

  1. 首先每一个 MemoryCache 肯定有相应的增删取功能
  2. 当 MemoryCache 被存满了(Android 应用的内存资源是很宝贵的),我们该怎么处理呢:
    • 回收最近没有用过的
    • 回收最早在内存中缓存的
    • 回收使用频率最低的
    • 在缓存时,key 相同的图片,回收旧的图片,缓存新的图
  3. 有时候我们可能需要缓存高分辨率的高清图片,而这种图片非常大,缓存到内存中就会 OOM,在这种情况下,为了让应用能正常运行,我们应该能在缓存时限制图片的大小

我就想到这么多哈,肯定还会有很多不一样的情况,毕竟需求是层出不穷的……那么根据现在得到的应用场景,我们就要开始设计 MemoryCache 啦。根据分析得到的结果我们可以发现:内存缓存有不一样的缓存策略和缓存限制,但是具有相同的抽象。所以我们首先需要实现 MemoryCache 的抽象:

public interface MemoryCache {
   

    boolean put(String key, Bitmap value);

    Bitmap get(String key);

    Bitmap remove(String key);

    Collection<String> keys();

    void clear();
}

实现了抽象,就得开始考虑具体实现拉。我们刚刚也说了,MemoryCache 具有不同的缓存策略和缓存限制,策略不一样的实现类一般不会存在继承关系,而具有相同限制的 MemoryCache 则可能存在抽象。那么我们可以得到:

public abstract class BaseMemoryCache implements MemoryCache
public abstract class FuzzyKeyMemoryCache implements MemoryCache
public abstract class LruMemoryCache implements 
  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值