Retrofit2.0的离线缓存
为何要使用离线缓存呢?因为我们的APP不能因为一些经常不去变动的数据,而去经常的访问网络,这样的话,我们顾客的流量可就真的花花花的在走,要是精明点的(你的APP就被Uninstall了)说完重要性,我们开始讲如何使用Retrofit2.0的离线缓存功能Retrofit2.0。
Okhttp3.0的配置
大家在使用Retrofit2.0时候就应该已近知道了。Retrofit2.0是建立在Okhttps的基础上进行的,因此对于缓存的设置我们也是对Okhttps上进行设置;
public class Http_Retroif {
private static final int DEFAULT_TIMEOUT = 5;
private final Chat2Server chat2Server;
private Http_Retroif() {
File cacheFile = new File(MyApplication.getContext().getCacheDir(), "response");
Cache cache = new Cache(cacheFile, 1024 * 1024 * 100); //100M
OkHttpClient.Builder builder = new OkHttpClient.Builder();
builder.connectTimeout(DEFAULT_TIMEOUT, TimeUnit.SECONDS)
.addNetworkInterceptor(interceptor)
.cache(cache);
OkHttpClient build = builder.build();
//Retrofit的声明(网络请求)
Retrofit mbuild = new Retrofit.Builder()
.baseUrl(Constant.HOSTNAME)
.client(build)
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.addConverterFactory(GsonConverterFactory.create())
.build();
//数据的类型
chat2Server = mbuild.create(Chat2Server.class);
}
public Chat2Server geterver() {
return chat2Server;
}
//在访问HttpMethods时创建单例
private static class SingletonHolder {
private static final Http_Retroif INSTANCE = new Http_Retroif();
}
//获取单例
public static Http_Retroif getInstance() {
return SingletonHolder.INSTANCE;
}
private Interceptor interceptor = new Interceptor() { //离线器(有网无网 都优先从缓存中取数据)
@Override
public Response intercept(Chain chain) throws IOException {
Request request = chain.request();
Response response = chain.proceed(request);
String cacheControl = request.cacheControl().toString();
if (TextUtils.isEmpty(cacheControl)) {
cacheControl = "public, max-age=43200";//响应头
}
return response.newBuilder()
.header("Cache-Control", cacheControl)
.removeHeader("Pragma")
.build();
}
};
}
我们来看一下接口的需要(@Headers是必要的)
@Headers("Cache-Control:public,max-age=43200")
@GET("servlet/ApiChat")
Observable<Robot_Information> getRobotInformation(@Query("access_token") String access_token,
@Query("s") String s,
@Query("clientId") String clientId);
更多信息请看Retrofit2.0的官网详细信息