Android 三级缓存机制:

    1、内存缓存  (LruCache算法)    2、本地缓存  (File存储)    3、网络缓存  (网络请求)

Android缓存策略:

缓存策略一般包括缓存的添加、获取、删除。缓存的添加和获取很容易懂,为什么要删除呢?无论是内存缓存还是硬盘缓存,缓存大小都是有限的,如果缓存满了,想要加进新的缓存,就需要删除一部分缓存,添加新的缓存。

LruCache:Least rencently used 顾名思义:近期最少使用算法。LruCache和DisLruCache两个类,分别用于内存和硬盘缓存。核心思想是当缓存空间满了之后,会删除最近最少使用的缓存。


一、内存缓存:LruCache

LruCache是Android3.1实现的缓存类,所以android可以直接使用它来实现内存缓存。DisLruCache不是SDK中的一部分。

1、LruCache的使用

LruCache的原理是将缓存对象作为强引用,保存在LinkedHashMap中,当缓存满了之后,将对象从Map中移除,重新通过put方法添加新的缓存,get方法获取缓存。

以图片缓存为例:

    int maxMemory = (int) (Runtime.getRuntime().totalMemory()/1024);        int cacheSize = maxMemory/8;        mMemoryCache = new LruCache(cacheSize){            @Override            protected int sizeOf(String key, Bitmap value) {                return value.getRowBytes()*value.getHeight()/1024;            }        };链接:https://www.jianshu.com/p/b49a111147ee

1、设置LruCache缓存的大小,一般为当前进程可用的1/8。
2、重写sizeOf方法,计算出缓存每张图片的大小

2、LruCache的原理

LruCache的核心思想就是维护一个缓存对象的队列,该队列由LinkedHashMap维护。一直没访问的对象放在队尾,最新访问的放在队首,当队列满了之后,从队尾开始淘汰,队首的最后淘汰。
用别人的一个图形象说明:

LruCache的源码里运用了LinkedHashMap的存取实现了缓存的添加(put)和获取(get)。

put()方法

public final V put(K key, V value) {         //不可为空,否则抛出异常        if (key == null || value == null) {            throw new NullPointerException("key == null || value == null");        }        V previous;        synchronized (this) {            //插入的缓存对象值加1            putCount++;            //增加已有缓存的大小            size += safeSizeOf(key, value);           //向map中加入缓存对象            previous = map.put(key, value);            //如果已有缓存对象,则缓存大小恢复到之前            if (previous != null) {                size -= safeSizeOf(key, previous);            }        }        //entryRemoved()是个空方法,可以自行实现        if (previous != null) {            entryRemoved(false, key, previous, value);        }        //调整缓存大小(关键方法)        trimToSize(maxSize);        return previous;    }

从代码可以看出,在添加缓存之后,调用了trimToSize方法,判断缓存是否已满,来判断缓存是否已满,如果满了就运用LruCache算法,删除队尾的缓存。

public void trimToSize(int maxSize) {        //死循环        while (true) {            K key;            V value;            synchronized (this) {                //如果map为空并且缓存size不等于0或者缓存size小于0,抛出异常                if (size < 0 || (map.isEmpty() && size != 0)) {                    throw new IllegalStateException(getClass().getName()                            + ".sizeOf() is reporting inconsistent results!");                }                //如果缓存大小size小于最大缓存,或者map为空,不需要再删除缓存对象,跳出循环                if (size <= maxSize || map.isEmpty()) {                    break;                }                //迭代器获取第一个对象,即队尾的元素,近期最少访问的元素                Map.Entry toEvict = map.entrySet().iterator().next();                key = toEvict.getKey();                value = toEvict.getValue();                //删除该对象,并更新缓存大小                map.remove(key);                size -= safeSizeOf(key, value);                evictionCount++;            }            entryRemoved(true, key, value, null);        }    }

总结:LruCache只要就是维护了一个LinkedHashMap。当调用put方法时,向队列中加入缓存对象,然后调用trimToSize()判断缓存时候已满,如果满了,用LinkedHashMap的迭代器从队尾移除最近使用最少的缓存。获取缓存时调用get(),调用 LinkedHashMap的get方法,并将获取的数据更新到队首。

二、本地缓存

三、网络缓存

通过异步网络请求,获取网络资源

更多相关文章

  1. 浅谈Java中Collections.sort对List排序的两种方法
  2. 类和 Json对象
  3. Python list sort方法的具体使用
  4. python list.sort()根据多个关键字排序的方法实现
  5. android上一些方法的区别和用法的注意事项
  6. android实现字体闪烁动画的方法
  7. Android中dispatchDraw分析
  8. Android四大基本组件介绍与生命周期
  9. Android(安卓)MediaPlayer 常用方法介绍

随机推荐

  1. Android录音应用实例教程
  2. android view(3)事件处理流程
  3. Android中ConnectivityManager监听网络状
  4. Android杂谈:cup信息查看
  5. Android(安卓)开发之 RecyclerView Adapt
  6. 快速反编译APK
  7. Android(安卓)Push Notification
  8. [Android]挂断、接听电话
  9. Android中的搜索框(SearchView)的功能和用
  10. Android图像处理(三)通过矩阵变换实现图像