美文网首页android面试
Retrofit 添加缓存功能

Retrofit 添加缓存功能

作者: NullPoint3Exce | 来源:发表于2019-11-06 10:35 被阅读0次

    正常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();
                }
            }
        };
    

    相关文章

      网友评论

        本文标题:Retrofit 添加缓存功能

        本文链接:https://www.haomeiwen.com/subject/wjaybctx.html