三级缓存是什么
三级缓存分为:
1.网络缓存
2.本地磁盘缓存
3.应用内存缓存
应用首次启动缓存执行顺序
网络 ----拿到数据-----> 本地磁盘 & 应用内存
再次启动应用执行顺序
应用内存 ---没有数据----> 本地磁盘 ---没有数据----> 网络
举例:
在我们没有使用三级缓存的应用中,我们每次打开app,应用都需要请求服务器,获取资源并且展示,大家都知道只要经过网络就会依赖信号强度,如果在弱网情况下,就会出现数据加载慢,用户等待时间长。界面空白,给用户带来差体验。
为什么要用到三级缓存
我们的App 经常会需要进行网络交互,通过网络获取数据是非常正常的事情。如果每次启动的时候都从网络拉取应用数据的话,这会消耗很多流量。对于用户来讲,流量就意味着电话费,一个很耗流量的应用肯定会多花套餐钱,这样用户数量肯定要受到影响。
特别是当我们需要重复浏览加载一些图片时,如果每一次浏览都通过网络来获取加载,流量的浪费可想而知有多大。所以才提出三级缓存策略,通过网络、本地、内存三级缓存图片,来减少不必要的网络交互,避免浪费流量。给用户带来更好的交互体验。
三级缓存怎么用
内存缓存
Lru(Least rencently used) :近期最少使用算法。LruCache和DisLruCache两个类,分别用于内存和硬盘缓存。核心思想是当缓存空间满了之后,会删除最近最少使用的缓存。
LruCache类使用
LruCache的原理是将缓存对象作为强引用,保存在LinkedHashMap中,当缓存满了之后,将对象从Map中移除,重新通过put方法添加新的缓存,get方法获取缓存。
LruCache的核心思想就是维护一个缓存对象的队列,该队列由LinkedHashMap维护。LruCache缓存策略队列满之后下次插入,会移除使用频率最低的元素。
磁盘缓存
由于DiskLruCache并不是由Google官方编写的,所以这个类并没有被包含在Android API当中,我们需要将这个类从网上下载下来,然后手动添加到项目当中。DiskLruCache的源码在Google Source上,地址如下:
android.googlesource.com/platform/libcore/+/jb-mr2-release/luni/src/main/java/libcore/io/DiskLruCache.java
下载好了源码之后,只需要在项目中新建一个io包,然后将DiskLruCache.java文件复制到这个包中即可。
DiskLruCache是不能new出实例的,如果我们要创建一个DiskLruCache的实例,则需要调用它的open()方法,接口如下所示:
public static DiskLruCache open(File directory, int appVersion, int valueCount, long maxSize)
open()方法接收四个参数,第一个参数指定的是数据的缓存地址,缓存地址通常都会存放在 /storage/Android/data/<你的包名>/cache, 这个路径下第二个参数指定当前应用程序的版本号,第三个参数指定同一个key可以对应多少个缓存文件,基本都是传第四个参数指定最多可以缓存多少字节的数据。
得到DiskLruCache的实例之后就可以对缓存的数据进行操作了,主要是写入、访问、移除等操作。
写入的操作是借助DiskLruCache.Editor这个类完成的。类似地,这个类也是不能new的,需要调用DiskLruCache的edit()方法来获取实例,接口如下所示:
public Editor edit(String key) throws IOException
可以看到,edit()方法接收一个参数key,这个key将会成为缓存文件的文件名,并且必须要和图片的URL是对应的。
String imageUrl = "https://xxx/xx/xx.jpg";
String key = hashKeyForDisk(imageUrl);
DiskLruCache.Editor editor = mDiskLruCache.edit(key);
有了DiskLruCache.Editor的实例之后,我们可以调用它的newOutputStream()方法来创建一个输出流,然后把它传入到downloadUrlToStream()中就能实现下载并写入缓存的功能了。注意newOutputStream()方法接收一个index参数,由于valueCount是1,所以index传0就可以了。在写入操作执行完之后,还需要执行commit()方法进行提交才能使写入生效,而调用abort()方法的话则表示放弃此次写入。
网络缓存
通过异步网络请求,获取网络资源
扩展三级缓存的应用场景
1.应用首页所有数据
2.列表数据
3.图片集合
4.用户信息
三级缓存实际落地需求
图片加载框架:yyds-zy/PictureLoadingFrame: 图片加载框架 (github.com)
如果对各位朋友有帮助的话,别忘了点上小星星⭐
PictureLoadingFrame
picture loading frame
Usage
Gradle
allprojects {
repositories {
maven { url 'https://jitpack.io' }
}
}
dependencies {
implementation 'com.github.yyds-zy:PictureLoadingFrame:1.0.1'
}
Maven
<repositories>
<repository>
<id>jitpack.io</id>
<url>https://jitpack.io</url>
</repository>
</repositories>
<dependency>
<groupId>com.github.yyds-zy</groupId>
<artifactId>PictureLoadingFrame</artifactId>
<version>1.0.1</version>
</dependency>
Use it in your own code:
ImageLoaderUtil.getInstance().with(this).disPlay(imageView,"pic_url");
网友评论