zoukankan      html  css  js  c++  java
  • retrofit2.0缓存设置

    如果你设置retrofit缓存出现了

    okhttp或者retrofit实现网络缓存504错误原因错误请使用以下方法设置缓存

     class Factory {
            private static String TAG = "factory";
            public static MovieApiService createService(final Context context) {
                //日志拦截器
                HttpLoggingInterceptor logging = new HttpLoggingInterceptor();
                logging.setLevel(HttpLoggingInterceptor.Level.BODY);
                /**
                 * 获取缓存
                 */
                Interceptor baseInterceptor = new Interceptor() {
                    @Override
                    public Response intercept(Chain chain) throws IOException {
                        Request request = chain.request();
                        if (!AppUtil.isNetWorkAvailable(context)) {
                            /**
                             * 离线缓存控制  总的缓存时间=在线缓存时间+设置离线缓存时间
                             */
                            int maxStale = 60 * 60 * 24 * 28; // 离线时缓存保存4周,单位:秒
                            CacheControl tempCacheControl = new CacheControl.Builder()
                                    .onlyIfCached()
                                    .maxStale(maxStale, TimeUnit.SECONDS)
                                    .build();
                            request = request.newBuilder()
                                    .cacheControl(tempCacheControl)
                                    .build();
                            Log.i(TAG, "intercept:no network ");
                        }
                        return chain.proceed(request);
                    }
                };
                //只有 网络拦截器环节 才会写入缓存写入缓存,在有网络的时候 设置缓存时间
                Interceptor rewriteCacheControlInterceptor = new Interceptor() {
                    @Override
                    public Response intercept(Chain chain) throws IOException {
                        Request request = chain.request();
                        Response originalResponse = chain.proceed(request);
                        int maxAge = 1 * 60; // 在线缓存在1分钟内可读取 单位:秒
                        return originalResponse.newBuilder()
                                .removeHeader("Pragma")// 清除头信息,因为服务器如果不支持,会返回一些干扰信息,不清除下面无法生效
                                .removeHeader("Cache-Control")
                                .header("Cache-Control", "public, max-age=" + maxAge)
                                .build();
                    }
                };
                //设置缓存路径 内置存储
                //File httpCacheDirectory = new File(context.getCacheDir(), "responses");
                //外部存储
                File httpCacheDirectory = new File(context.getExternalCacheDir(), "responses");
                //设置缓存 10M
                int cacheSize = 10 * 1024 * 1024;
                Cache cache = new Cache(httpCacheDirectory, cacheSize);
     
                OkHttpClient client = new OkHttpClient.Builder()
                        .cache(cache)
                        .addInterceptor(logging)
                        .addInterceptor(baseInterceptor)
                        .addNetworkInterceptor(rewriteCacheControlInterceptor)
                        .connectTimeout(15, TimeUnit.SECONDS)
                        .build();
     
                return new Retrofit.Builder()              
          .addConverterFactory(GsonConverterFactory.create())
          .addCallAdapterFactory(RxJavaCallAdapterFactory.create() .baseUrl(BASEURL) .client(client) .build() .create(MovieApiService.class); } }

      需要借助CacheControl 类才可以正常使用

  • 相关阅读:
    【VUE】5.路由导航守卫
    【VUE】4.配置axios发起请求
    【VUE】3.表单操作
    【GIT】命令笔记
    【VUE】2.渲染组件&重定向路由
    【Vue】1.前端项目初始化
    【PYTHON】操作excel笔记
    【Python】python 入门与进阶
    【flask-migrate】:ERROR [root] Error: Target database is not up to date.
    【Flask】学习笔记(一)入门
  • 原文地址:https://www.cnblogs.com/lvlv/p/14182736.html
Copyright © 2011-2022 走看看