安卓项目实战之强大的网络请求框架okGo使用详解(三):缓存的使用

相关实体类必须实现序列化接口

使用缓存前,必须让涉及到缓存javaBean对象实现Serializable接口,否者会报NotSerializableException。因为缓存的原理是将对象序列化后直接写入数据库中,如果不实现Serializable接口,会导致对象无法序列化,进而无法写入到数据库中,也就达不到缓存的效果。

示例代码

在这里插入图片描述涉及到缓存相关的api一共是如下五个:
1. cacheKey
每次框架是根据这个cacheKey去到数据库中寻找缓存的,所以一般来说,每个不同功能的请求都要设置不一样的cacheKey,如果相同,会导致数据库中的缓存数据发生覆盖或错乱。如果不指定cacheKey,默认是用url带参数的全路径名为cacheKey。
2. cacheMode
目前默认提供了五种CacheMode缓存模式,不同的模式会有不同的Callback回调顺序

NO_CACHE:不使用缓存,该模式下cacheKey、cacheTime 参数均无效
DEFAULT:按照HTTP协议的默认缓存规则,例如有304响应头时缓存。
REQUEST_FAILED_READ_CACHE:先请求网络,如果请求网络失败,则读取缓存,如果读取缓存失败,本次请求失败。
IF_NONE_CACHE_REQUEST:如果缓存不存在才请求网络,否则使用缓存。
FIRST_CACHE_THEN_REQUEST:先使用缓存,不管是否存在,仍然请求网络。

3. cacheTime
当前缓存的有效时间是多长,单位毫秒,上面示例是3600秒,也就是一个小时,这个根据自己需要设置,如果不设置,默认是CacheEntity.CACHE_NEVER_EXPIRE=-1,也就是永不过期。该参数对DEFAULT模式是无效的,因为该模式是完全遵循标准的http协议的,缓存时间是依靠服务端响应头来控制,所以客户端的cacheTime参数无效。

4. cachePolicy
这个是自定义的缓存策略,内置的五大缓存模式其实就是这个缓存策略CachePolicy接口的五种不同实现,如果这五种模式不能满足你,你完全可以自行实现这个接口,写出属于你自己的缓存规则。

5. onCacheSuccess
当缓存读取成功后,回调的是这个方法,如果你只复写了onSuccess方法,是无法获取缓存的,这里要注意。

缓存的相关操作

我们知道缓存是保存在数据库中的,那么其实缓存的操作也就是数据库的操作,那么操作这个数据库中缓存表的对象是这个CacheManager,它是个单例模式,里面提供了很多方法,常用的方法如下:
获取所有的缓存,但是一般每个缓存的数据类型都不一样,所以缓存的泛型使用 ?
在这里插入图片描述根据cacheKey获取对应的缓存,一共有以下几种写法:
在这里插入图片描述根据cacheKey删除指定缓存,返回值是否删除成功
在这里插入图片描述清除所有缓存,返回值是否删除成功
在这里插入图片描述其他操作,自己查看CacheManager中的方法
在这里插入图片描述

项目中使用缓存

一般使用缓存的时候,指定cacheKey和cacheMode就行了,但是遇到列表缓存的时候,我们通常的做法是只缓存下拉刷新的第一页的数据,上拉加载获得的数据不进行缓存,代码示例如下:
在这里插入图片描述在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/gpf1320253667/article/details/83626638
今日推荐