Retrofit+RxJava实战日志(5)-如何获取缓存

首先OKHttp启用缓存目录

1
2
3
4
5
OkHttpClient mOkHttpClient = new OkHttpClient();
File cacheDirectory = new File(context.getApplicationContext()
.getCacheDir().getAbsolutePath(), "HttpCache"); //指定缓存路径
Cache cache = new Cache(cacheDirectory, 20 * 1024 * 1024); //指定缓存大小
mOkHttpClient.setCache(cache);

Retrofit可以用@POST、@GET注解定义POST方法和GET方法
在参数中用@Header定义请求头部。

参考HTTP协议的内容(传送门:HTTP协议笔记)
POST方法没有缓存;
头部Cache-Control设为max-age=0时则不会使用缓存而请求服务器;
为if-only-cache时只查询缓存而不会请求服务器,max-stale可以配合设置缓存失效时间

以之前写的Retrofit+RxJava实战日志(2)-基本使用为例:

1
2
3
4
5
6
7
8
public abstract class BaseApi {
//设缓存有效期为两个星期
protected static final long CACHE_STALE_SEC = 60 * 60 * 24 * 14;
//查询缓存的Cache-Control设置
protected static final String CACHE_CONTROL_CACHE = "only-if-cached, max-stale=" + CACHE_STALE_SEC;
//查询网络的Cache-Control设置
protected static final String CACHE_CONTROL_NETWORK = "max-age=0";
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
public class UserApi extends BaseApi{
//定义接口
private interface UserService {
//POST方法没有缓存,适用于更新操作的接口
@FormUrlEncoded
@POST("user/user_updateUserName")
Observable<BaseResp> updateUserName(@Field("userName") String userName);
//用@Header设置Cache-Control
@GET("user/user_queryProfile")
Observable<UserProfileResp> queryProfile(@Header("Cache-Control") String cacheControl,
@Query("userId") int userId);
}
protected static final UserService service = getRetrofit().create(UserService.class);
//更新用户名接口
public static Observable<BaseResp> updateUserName(String userName){
return service.updateUserName(userName);
}
//查询用户信息网络接口
public static Observable<UserProfileResp> queryProfile(int userId){
return service.queryProfile(CACHE_CONTROL_NETWORK, userId);
}
//查询用户信息缓存接口
public static Observable<UserProfileResp> queryProfileCache(int userId){
return service.queryProfile(CACHE_CONTROL_CACHE, userId);
}
}

如此在需要查询缓存的时候调用queryProfileCache,在需要网络数据时调用queryProfile即可。