首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Retrofit2.1.0 2.1.0和okhttp3离线缓存不起作用

Retrofit2.1.0 2.1.0和okhttp3离线缓存不起作用
EN

Stack Overflow用户
提问于 2016-12-14 18:56:00
回答 1查看 410关注 0票数 1

我正在尝试使用Retrofit和OkHttp实现缓存。离线时,我得到的错误是'504不可满足的请求(只有在缓存的情况下)‘。

代码语言:javascript
复制
OkHttpClient.Builder builder = new OkHttpClient().newBuilder();
        builder.readTimeout(10, TimeUnit.SECONDS);
        builder.connectTimeout(5, TimeUnit.SECONDS);

        if (isDebug) {
            HttpLoggingInterceptor logging = new HttpLoggingInterceptor();
            logging.setLevel(HttpLoggingInterceptor.Level.BODY);
            builder.addInterceptor(logging);
        }

        builder.addNetworkInterceptor(REWRITE_RESPONSE_INTERCEPTOR)
                .addInterceptor(OFFLINE_INTERCEPTOR)
                .cache(provideCache());


        OkHttpClient client = builder.build();




        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(base_url)
                .addConverterFactory(GsonConverterFactory.create())
                .client(client)
                .build();

        reqinterface = retrofit.create(MyApiInterface.class);

  private static Cache provideCache(){
    Cache cache = null;
    try{

        cache = new Cache(new File(context.getCacheDir(),"baskin-cache"),
                10*1024*1024);
    }catch (Exception e){
        Log.i("zacharia","Could not create Cache");
    }
    return  cache;
}
  private static final Interceptor REWRITE_RESPONSE_INTERCEPTOR = new Interceptor() {
    @Override
    public okhttp3.Response intercept(Chain chain) throws IOException {
        okhttp3.Response originalResponse = chain.proceed(chain.request());
        String cacheControl = originalResponse.header("Cache-Control");

        if (cacheControl == null || cacheControl.contains("no-store") || cacheControl.contains("no-cache") ||
                cacheControl.contains("must-revalidate") || cacheControl.contains("max-age=0")) {
            return originalResponse.newBuilder()
                    .header("Cache-Control", "public, max-age=" + 120)
                    .build();
        } else {
            return originalResponse;
        }
    }
};

private static final Interceptor OFFLINE_INTERCEPTOR = new Interceptor() {
    @Override
    public okhttp3.Response intercept(Chain chain) throws IOException {
        Request request = chain.request();

        if (!isOnline()) {
            Log.d("zacharia", "rewriting request");

            int maxStale = 60 * 60 * 24 * 7; // tolerate 4-weeks stale
            request = request.newBuilder()
                    .header("Cache-Control", "public, only-if-cached, max-stale=" + maxStale)
                    .build();
        }

        return chain.proceed(request);
    }
};

public static boolean isOnline() {
    ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
    NetworkInfo netInfo = cm.getActiveNetworkInfo();
    return netInfo != null && netInfo.isConnectedOrConnecting();
}

当在线时,我在日志中得到'D/OkHttp: Cache-Control: public,max-age=120‘。离线时,'D/OkHttp:<-- 504不可满足的请求(仅当缓存时)‘

EN

回答 1

Stack Overflow用户

发布于 2017-03-31 04:02:33

您可以尝试调试方法okhttp3.internal.cache.CacheInterceptor#intercept(Chain)okhttp3.Cache#get(Request),以了解未返回前一个响应的原因。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41140841

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档