转载请标明出处,本文出自:chaossss的博客
Cache
我们要对图片进行缓存,有两种方式:内存缓存和本地缓存。这两种方式的区别在于,内存缓存是缓存在 Android 系统为应用分配的运行内存之中,读取速度快,但是可能会带来 OOM 的问题;本地缓存一般缓存在 SD 卡中,读取速度较慢,但是缓存空间足。
那么我们要怎么来实现内存缓存和本地缓存呢?根据单一职责原则,如果 MemoryCache 和 DiskCache 的抽象不一致的话,我们就需要分别创建 MemoryCache 和 DiskCache 的抽象基类,分别实现各自的细节。而显然,两者抽象是不一致的,因为 MemoryCache 面对的对象是图片(Bitmap),DiskCache 面对的对象是文件(File)。因此,我们应该分开实现 MemoryCache 和 DiskCache。
MemoryCache
MemoryCache 整体设计及相关基类的实现
那我们现在该干啥呢?想 MemoryCache 的功能啊!对于进行内存缓存我们能想到什么应用场景呢:
- 首先每一个 MemoryCache 肯定有相应的增删取功能
- 当 MemoryCache 被存满了(Android 应用的内存资源是很宝贵的),我们该怎么处理呢:
- 回收最近没有用过的
- 回收最早在内存中缓存的
- 回收使用频率最低的
- 在缓存时,key 相同的图片,回收旧的图片,缓存新的图
- 有时候我们可能需要缓存高分辨率的高清图片,而这种图片非常大,缓存到内存中就会 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