ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
#### 12.2.1 LruCache LruCache是Android 3.1所提供的一个缓存类,通过support-v4兼容包可以兼容到早期的Android版本,目前Android 2.2以下的用户量已经很少了,因此我们开发的应用兼容到Android 2.2就已经足够了。为了能够兼容Android 2.2版本,在使用LruCache时建议采用support-v4兼容包中提供的LruCache,而不要直接使用Android 3.1提供的LruCache。 LruCache是一个泛型类,它内部采用一个LinkedHashMap以强引用的方式存储外界的缓存对象,其提供了get和put方法来完成缓存的获取和添加操作,当缓存满时,LruCache会移除较早使用的缓存对象,然后再添加新的缓存对象。这里读者要明白强引用、软引用和弱引用的区别,如下所示。 · 强引用:直接的对象引用; · 软引用:当一个对象只有软引用存在时,系统内存不足时此对象会被gc回收; · 弱引用:当一个对象只有弱引用存在时,此对象会随时被gc回收。 另外LruCache是线程安全的,下面是LruCache的定义: public class LruCache<K, V> { private final LinkedHashMap<K, V> map; ... } LruCache的实现比较简单,读者可以参考它的源码,这里仅介绍如何使用LruCache来实现内存缓存。仍然拿图片缓存来举例子,下面的代码展示了LruCache的典型的初始化过程: int maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024); int cacheSize = maxMemory / 8; mMemoryCache = new LruCache<String, Bitmap>(cacheSize) { @Override protected int sizeOf(String key, Bitmap bitmap) { return bitmap.getRowBytes() * bitmap.getHeight() / 1024; } }; 在上面的代码中,只需要提供缓存的总容量大小并重写sizeOf方法即可。sizeOf方法的作用是计算缓存对象的大小,这里大小的单位需要和总容量的单位一致。对于上面的示例代码来说,总容量的大小为当前进程的可用内存的1/8,单位为KB,而sizeOf方法则完成了Bitmap对象的大小计算。很明显,之所以除以1024也是为了将其单位转换为KB。一些特殊情况下,还需要重写LruCache的entryRemoved方法,LruCache移除旧缓存时会调用entryRemoved方法,因此可以在entryRemoved中完成一些资源回收工作(如果需要的话)。 除了LruCache的创建以外,还有缓存的获取和添加,这也很简单,从LruCache中获取一个缓存对象,如下所示。 mMemoryCache.get(key) 向LruCache中添加一个缓存对象,如下所示。 mMemoryCache.put(key, bitmap) LruCache还支持删除操作,通过remove方法即可删除一个指定的缓存对象。可以看到LruCache的实现以及使用都非常简单,虽然简单,但是仍然不影响它具有强大的功能,从Android 3.1开始,LruCache就已经是Android源码的一部分了。