android面试

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();
            }
        }
    };
上一篇 下一篇

猜你喜欢

热点阅读