当网络响应返回错误时,如何使用OkHttp对Retrofit使用缓存响应

时间:2017-07-24 12:45:18

标签: android caching retrofit okhttp

我有一个简单的用例:成功时使用网络响应。否则使用缓存响应。 但问题是,当网络响应是一个错误时,缓存也会写入该响应。

我读到的一个建议是当networkResponse不成功时在Interceptor中执行FORCE_CACHE。 但由于networkResponse会覆盖缓存并出现错误,因此下次请求时(服务器仍然返回错误),缓存将出错。

以下是我目前的代码段。当networkResponse是一个错误时,我需要添加用于返回缓存值的逻辑。任何建议都会有很大帮助。

private void setup() {
    OkHttpClient.Builder builder = new OkHttpClient.Builder();
    builder.addInterceptor(REWRITE_CACHE_CONTROL);

    File httpCacheDirectory = new File(context.getCacheDir(), "responses");
    Cache cache = new Cache(httpCacheDirectory, 10 * 1024 * 1024); // 10 MB
    builder.cache(cache);
}


private static final Interceptor REWRITE_CACHE_CONTROL = new Interceptor() {
    @Override
    public okhttp3.Response intercept(@NonNull Chain chain) throws IOException {
        Request request = chain.request();
        if (!hasAConnection()) {
            request = request.newBuilder().cacheControl(CacheControl.FORCE_CACHE).build();
        }
        return chain.proceed(request);
    }
};

0 个答案:

没有答案