Retrofit自定义缓存逻辑示例
Retrofit 的缓存拦截器实现方式,还是挺实用的。对 Android 开发来说,Retrofit+OkHttp 算是标配了,但缓存用得好不好,真的能拉开差距。这个 demo 项目就围绕着“怎么自定义缓存逻辑”来展开,代码结构清晰,逻辑也好理解。
Retrofit 的网络求,用的是底层的OkHttpClient。而缓存这块,关键就在于你怎么配置它的Cache对象。像下面这样写,基本就是标准套路:
int cacheSize = 10 * 1024 * 1024; // 10MB
Cache cache = new Cache(context.getCacheDir(), cacheSize);
OkHttpClient client = new OkHttpClient.Builder()
.cache(cache)
.build();
嗯,这样配置下来,离线时也能读缓存,响应也快。可要想更灵活点,比如判断当前有没有网络,再决定走不走缓存,就得上自定义拦截器了。
像 demo 里用到的CacheInterceptor
,逻辑就挺常用的。检查网络状态,有网就移除默认Cache-Control
,没网就加上only-if-cached
强制读缓存。
public class CacheInterceptor implements Interceptor {
@Override
public Response intercept(Chain chain) throws IOException {
Request request = chain.request();
if (isNetworkAvailable()) {
request = request.newBuilder()
.removeHeader("Cache-Control")
.build();
} else {
request = request.newBuilder()
.header("Cache-Control", "only-if-cached")
.build();
}
return chain.proceed(request);
}
}
想让它生效,就加到你的OkHttpClient.Builder
里:
OkHttpClient client = new OkHttpClient.Builder()
.addInterceptor(new CacheInterceptor())
.cache(cache)
.build();
项目里的MyApplication3
应该就是主入口,里面集成了 Retrofit 接口和各种配置。你可以照着改造自己的项目,或者直接 copy 那段代码试试。
如果你平时遇到网络求慢、用户在断网状态下体验差的问题,这个缓存方案真的值得一试。用得巧了,能省下不少事儿。
感兴趣的话,可以顺便看看这些相关内容:
下载地址
用户评论