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 类才可以正常使用

  • 相关阅读:
    想要在控件里面使用触发器,只需要将下面代码填入控件中间即可
    WPF有关控件和模板样式设计的微软官方文档
    XDG0062 XAML 与XDG0008 XAML 错误的解决办法
    在WPF中一种较好的绑定Enums数据方法
    FrameworkElementFactory中的SetBinding与SetValue
    线性表结构:栈
    关于链表的一些问题
    使用Mybatis-Plus的一个坑
    双向链表和双向循环链表
    上下文切换的确切含义了解下
  • 原文地址:https://www.cnblogs.com/lvlv/p/14182736.html
Copyright © 2011-2022 走看看