ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
***** **LruCache** [TOC=6] # 1. Android中的缓存策略 **** ![](https://box.kancloud.cn/05813e99bfe15cc7fb34865616cd90fd.webp) 一般来说,缓存策略主要包含缓存的添加、获取和删除这三类操作。如何添加和获取缓存这个比较好理解,那么为什么还要删除缓存呢?这是因为不管是内存缓存还是硬盘缓存,它们的缓存大小都是有限的。当缓存满了之后,再想其添加缓存,这个时候就需要删除一些旧的缓存并添加新的缓存。 因此LRU(Least Recently Used)缓存算法便应运而生,LRU是近期最少使用的算法,它的核心思想是当缓存满时,会优先淘汰那些近期最少使用的缓存对象。采用LRU算法的缓存有两种:LrhCache和DisLruCache,分别用于实现内存缓存和硬盘缓存,其核心思想都是LRU缓存算法。 # 2. LruCache介绍 LruCache是Android 3.1所提供的一个缓存类,所以在Android中可以直接使用LruCache实现内存缓存。而DisLruCache目前在Android 还不是Android SDK的一部分,但Android官方文档推荐使用该算法来实现硬盘缓存。 LruCache是个泛型类,主要算法原理是把最近使用的对象用强引用(即我们平常使用的对象引用方式)存储在 LinkedHashMap 中。当缓存满时,把最近最少使用的对象从内存中移除,并提供了get和put方法来完成缓存的获取和添加操作。 # 3. LruChahe的使用 ` ~~~ private LruCache<String, Bitmap> mMemoryCache; @Override protected void onCreate(Bundle savedInstanceState) {     ...     // Get max available VM memory, exceeding this amount will throw an     // OutOfMemory exception. Stored in kilobytes as LruCache takes an     // int in its constructor.     final int maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024);     // Use 1/8th of the available memory for this memory cache.     final int cacheSize = maxMemory / 8;     mMemoryCache = new LruCache<String, Bitmap>(cacheSize) {         @Override         protected int sizeOf(String key, Bitmap bitmap) {             // The cache size will be measured in kilobytes rather than             // number of items.             return bitmap.getByteCount() / 1024;         }     };     ... } public void addBitmapToMemoryCache(String key, Bitmap bitmap) {     if (getBitmapFromMemCache(key) == null) {         mMemoryCache.put(key, bitmap);     } } public Bitmap getBitmapFromMemCache(String key) {     return mMemoryCache.get(key); } ~~~ `