【问题标题】:How to Cache the response in squareup.okhttp3如何在 squareup.okhttp3 中缓存响应
【发布时间】:2016-11-14 07:00:58
【问题描述】:

我正在尝试通过 OKhttp 缓存 http 响应 但找不到一些好的示例或文档。

感谢您的帮助

【问题讨论】:

  • 你想做什么? SharedPreferences 还不够吗?好的。将其保存在数据库中怎么样?
  • 我正在使用 OK http 的库。我想使用其缓存选项缓存 http 响应。所以我想知道有哪些可用的选项来做到这一点。
  • check this了吗?

标签: java android caching okhttp


【解决方案1】:

这会将您的所有响应缓存 2 分钟

OkHttpClient provideOkHttpClient () {
    Cache cache = new Cache(new File(context.getCacheDir(), "http-cache"), 10 * 1024 * 1024);
    return new OkHttpClient.Builder()
            .addNetworkInterceptor(provideCacheInterceptor())
            .cache(cache)
            .build();
}

Interceptor provideCacheInterceptor () {
    return new Interceptor() {
        @Override
        public Response intercept (Chain chain) throws IOException {
            Response response = chain.proceed( chain.request() );
            CacheControl cacheControl = new CacheControl.Builder()
                    .maxAge( 2, TimeUnit.MINUTES )
                    .build();

            return response.newBuilder()
                    .header("Cache-Control", cacheControl.toString() )
                    .build();
        }
    };
}

【讨论】:

  • 如果我们不设置 cacheControl,OkHttp 会为其所有请求保留缓存多长时间?
  • 怎么用?哪里有例子?它只是零件代码的一部分。我认为这是不好的答案。
【解决方案2】:
public final class FeedInterceptor {

private final static String TAG = FeedInterceptor.class.getSimpleName();

/**
 * Validate cache, return stream. Return cache if no network.
 * @param context
 * @return
 */
public static Interceptor getOnlineInterceptor(final Context context){
    Interceptor interceptor = new Interceptor() {
        @Override
        public Response intercept(Chain chain) throws IOException {
            Response response = chain.proceed(chain.request());

            String headers = response.header("Cache-Control");
            if(NetworkUtils.isConnected(context) && (headers == null
                  || headers.contains("no-store")
                  || headers.contains("must-revalidate")
                  || headers.contains("no-cache")
                  || headers.contains("max-age=0"))) {

                LOGD(TAG, "Returning fresh response");
                return response.newBuilder()
                        .header("Cache-Control", "public, max-age=600")
                        .build();
            } else{
                LOGD(TAG, "Returning old response");
                return response;
            }
        }
    };

    return interceptor;
}

/**
 * Get me cache.
 * @param context
 * @return
 */
public static Interceptor getOfflineInterceptor(final Context context){
    Interceptor interceptor = new Interceptor() {
        @Override
        public Response intercept(Chain chain) throws IOException {
            Request request = chain.request();
            if(!NetworkUtils.isConnected(context)){
                request = request.newBuilder()
                        .header("Cache-Control", "public, only-if-cached")
                        .build();
            }

            return chain.proceed(request);
        }
    };

    return interceptor;
}

} // End FeedInterceptor

还有客户:

private OkHttpClient createCacheClient(Context context){

    File httpCacheDirecotory = new File(context.getCacheDir(), FILE);
    Cache cache = new Cache(httpCacheDirecotory, CACHE_SIZE);

    return new OkHttpClient.Builder()
            .addNetworkInterceptor(FeedInterceptor.getOnlineInterceptor(context))
            .addInterceptor(FeedInterceptor.getOfflineInterceptor(context))
            .cache(cache)
            .build();
}

Reference

【讨论】:

    【解决方案3】:

    这里有一个示例CacheResponse.java

    Cache cache = new Cache(cacheDirectory, cacheSize);
    
    client = new OkHttpClient.Builder()
        .cache(cache)
        .build();
    

    javadoc for Cache 提供了强制新响应或缓存响应的示例。

    【讨论】:

    • Yuri 它正在工作,但我想做运行时内存缓存而不是磁盘内存,并且还想知道如何进一步删除缓存。我这里用的是普通的http客户端。
    • Cache 的设计基于真实的文件系统 AFAIK。公共 API 看起来不可能。我怀疑您需要将缓存与文件系统一起使用,或者在拦截器中实现自己的缓存策略
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-13
    • 2017-09-03
    • 2013-08-29
    • 2011-04-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多