Retrofit 添加缓存功能
2019-11-06 本文已影响0人
NullPoint3Exce
正常retrofit使用
// 声明接口
public interface ImageApi {
String baseUrl ="http://gank.io/";
@GET("api/data/福利/20/1")
Call<ResponseBody> getImageList();
}
//实现请求接口的功能
Retrofit builder = new Retrofit.Builder() .baseUrl(ImageApi.baseUrl)
.client(okHttpClient) //1----此处有说明
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.addConverterFactory(GsonConverterFactory.create())
.build();
ImageApi imageApi = builder.create(ImageApi.class);
Call<ResponseBody> imageList = imageApi.getImageList();
imageList.enqueue(new Callback<ResponseBody>() {
@Override
public void onResponse(Call<ResponseBody> call, retrofit2.Response<ResponseBody> response) {
try {
Log.d(TAG, "onResponse: "+response.body().string());
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void onFailure(Call<ResponseBody> call, Throwable t) {
Log.d(TAG, "onFailure: "+t.getMessage());
}
});
想要实现添加缓存功能,实则是okhttpclient添加缓存功能。需要添加拦截器
代码如下:
// 创建okhttpClient对象
OkHttpClient okHttpClient = new OkHttpClient.Builder()
// 添加需要缓存的位置,且设置缓存的大小
.cache(new Cache(new File(getExternalCacheDir(), "test_cache"), 10 * 1024 * 1024))
// 添加自定义的缓存拦截器
.addInterceptor(cacheInterceptor)
// 添加连接超时限制
.connectTimeout(5, TimeUnit.SECONDS)
.build();
最后把当前的okhttpClient对象赋值给retrofit.builder的client方法即可。
.client(okHttpClient)
接下来实现自定义的缓存对象
Interceptor cacheInterceptor = new Interceptor() {
@Override
public Response intercept(Chain chain) throws IOException {
Request request = chain.request();
if (isNetworkConnected(MainActivity.this)) {
Response response = chain.proceed(request);
// read from cache for 0 s 有网络不会使用缓存数据
int maxAge = 10;
String cacheControl = request.cacheControl().toString();
return response.newBuilder()
.removeHeader("Pragma")
.removeHeader("Cache-Control")
.header("Cache-Control", "public, max-age=" + maxAge)
.build();
} else {
//无网络时强制使用缓存数据
request = request.newBuilder()
.cacheControl(CacheControl.FORCE_CACHE)
.build();
Response response = chain.proceed(request);
//set cahe times ; value is useless at all !
int maxStale = 60 * 60 * 24 * 3;
return response.newBuilder()
.removeHeader("Pragma")
.removeHeader("Cache-Control")
.header("Cache-Control", "public, only-if-cached, max-stale=" + maxStale)
.build();
}
}
};