java lrucache_Java LruCache 的使用及原理

本文介绍了如何利用Android的LruCache进行图片内存缓存,演示了如何编写MyImageLoader类实现缓存功能,以及LruCache的工作原理和内部实现。通过实例展示了如何在Activity中加载图片并观察缓存效果。
摘要由CSDN通过智能技术生成

49eed51603e600f5f4e310365bcedf63.png

概述

LRU (Least Recently Used) 的意思就是近期最少使用算法,它的核心思想就是会优先淘汰那些近期最少使用的缓存对象。

在我们日常开发中,UI 界面进行网络图片加载是很正常的一件事情,但是当界面上的图片过于多的时候,不可能每次都从网络上进行图片的获取,一方面效率会很低,另一方面,也会非常耗费用户的流量。

Android 为我们提供了 LruCache 类,使用它我们可以进行图片的内存缓存,今天我们就一起学习一下吧。

使用 LruCache 进行图片加载

1. 编写 MyImageLoader 类,实现图片缓存功能。

8b518f54ac8a3bbdffb1167b49011700.png

ad5dfc172248fe36dd79d16595a5a2b3.png

至于代码的具体含义,注释已经进行了诠释。

2. 在 Activity 中进行图片的缓存及加载

a73201b78e956f745739dfa54d42f4ea.png

c07f5a5cc353bfdc4f65871660ce7a88.png

8ab6edc81fc08cd34c687db3f94bd77d.png

e5bf2de676c2503de7204d3cfae0c180.png

其中的布局文件就很简单,一个按钮 + 一个 Imageview

4333bf446f37fd884cd968ad0ae0ccdd.png

代码中还用到了一个工具类,主要用于将图片的 url 转换为 md5 编码后的字符串,用作缓存文件的 key 进行存储,保证其独一性

29a40073a1e6f619ea5275fca6b9859f.png

3. 实际使用

我们进行加载图片按钮的多次点击,通过 log 进行查看是否正常缓存

9db1be89d3ea0575f57a5290707823ce.png

可以看出,除了第一次图片是从网络上进行下载,之后都是从缓存中进行获取。

LruCache 原理解析

LruCache 的文档描述

A cache that holds strong references to a limited number of values. Each time a value is accessed, it is moved to the head of a queue. When a value is added to a full cache, the value at the end of that queue is evicted and may become eligible for garbage collection.

一个包含有限数量强引用的缓存,每次访问一个值,它都会被移动到队列的头部,将一个新的值添加到已经满了的缓存队列时,该队列末尾的值将会被逐出,并且可能会被垃圾回收机制进行回收。

LruCache 构造函数

创建了一个 LinkedHashMap,三个参数分别为 初始容量、加载因子和访问顺序,当 accessOrder 为 true 时,这个集合的元素顺序就会是访问顺序,也就是访问了之后就会将这个元素放到集合的最后面。

60b188538334d5abc1e61d4c97501c00.png

有些人可能会有疑问,初始容量传 0 的话,那岂不是没办法进行存储了,那么创建这个 LinkedHashMap 还有什么意义呢?

其实要解答这个问题并不难,看下源码你就会发现

其实第一个参数是你要设置的初始大小;而程序内部实际的初始大小是1;如果你设置的初始大小(initialCapacity)小于1, 那么map大小就是默认的1;否则会不断左移(乘2)直到capacity大于你设置的initialCapacity;

f42d85d5fbe0ba9a2a87b88539e823d8.png

LruCache 的 put 方法

其中的 trimToSize() 方法用于判断加入元素后是否超过最大缓存数,如果超过就清除掉最少使用的元素。

608292db25c788de8c2bb787c14bd10c.png

16a84d3d48d71706e6bddf85d13eba07.png

LruCache 的 get 方法

LruCahche 的 get() 方法源码

25a8f2badb98d70f0b765b82c19a59f1.png

LinkedHashMap 的 get() 方法源码

0c27460a386f750aee3c18079e9305df.png

afterNodeAccess() 方法源码

ab1c2615ce423e250ab8d5c34616d1ff.png

LruCache 的 remove 方法

从缓存中删除内容,并更新缓存大小

b3711cef6f73211ad15b940554adc97e.png

总结

当缓存满了之后,LruCache 是最近最少使用的元素会被移除内部使用了 LinkedHashMap 进行存储总缓存大小一般为可用内存的 1/8当使用 get() 访问元素后,会将该元素移动到 LinkedHashMap 的尾部

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值