android lru进程队列,Android 三级缓存 LruCache缓存机制

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;

}

};

1、设置LruCache缓存的大小,一般为当前进程可用的1/8。

2、重写sizeOf方法,计算出缓存每张图片的大小

2、LruCache的原理

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

用别人的一个图形象说明:

d213507779fb

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方法,并将获取的数据更新到队首。

二、本地缓存

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值