java - okhttp缓存:how to get cache data first then get network data in network connetting?

标签 java okhttp cache-control

引用:https://github.com/square/okhttp/issues/4003

大多数解决方案都是网络请求网络,没有网络请求缓存。 我的要求是先有网络请求缓存,然后再请求网络。 谢谢!!!

我正在尝试这样:

 @Override
public okhttp3.Response intercept(Chain chain) throws IOException {
    //拦截Request对象
    Request request = chain.request();
    //判断有无网络连接
    boolean connected = CommonUtils.isNetConnected();
    if (connected) {
        Response response = chain.proceed(request);
        return response.newBuilder()
                .removeHeader("Pragma")
                .removeHeader("Cache-Control")
                .header("Cache-Control", "public, max-age=" + TIMEOUT_CONNECT)
                .build();
    } else {
        //没有网络
        BeLog.e(TAG, "没有有网络");
        //无网络时强制使用缓存数据
        request = request.newBuilder()
                .cacheControl(CacheControl.FORCE_CACHE)
                .build();
        Response response = chain.proceed(request);
        return response.newBuilder()
                .removeHeader("Pragma")
                .removeHeader("Cache-Control")
                .header("Cache-Control", "public, only-if-cached, max-stale=" + TIMEOUT_DISCONNECT)
                .build();
    }

    //return response;
}

最佳答案

尝试使用 CacheControl.Builder().immutable().build(),例如:

val cacheSize: Long = 10 * 1024 * 1024  // 10 MB
val cache = Cache(applicationContext.cacheDir, cacheSize)

val interceptor = Interceptor { chain ->
    val request: Request? = chain.request()?.newBuilder()?.cacheControl(CacheControl.Builder().immutable().build())?.build()
    chain.proceed(request)
}

val okHttpClient = OkHttpClient.Builder()
    .cache(cache)
    .addInterceptor(interceptor)
    .build()

val builder = Retrofit.Builder()
     .baseUrl("yourBaseUrl")
     .client(okHttpClient)
     .addConverterFactory(GsonConverterFactory.create())

builder.build()

关于java - okhttp缓存:how to get cache data first then get network data in network connetting?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50341923/

相关文章:

java - 静态方法只能识别一个对象,不能识别其他对象

java - JMenu 不在 Windows 外观中

java - 带有 OkHttp3 和 Retrofit2 的 HTTP/2

http - 当没有返回与缓存相关的 header 时,浏览器是否会执行缓存响应?

java - JFrame 关闭操作

java - 授予 JApplet 对本地文件系统的读写访问权限

java - 如何在 OK-HTTP header 中添加非 ASCII 字符串?

android - OkHttp3 hostnameVerifier 由 : javax.net.ssl.SSLException : Read error: ssl=0xc8cf1fc8: I/O error during system call, 对等方重置连接引起

http-headers - 为什么浏览器不发送“If-None-Match” header ?

java - 为什么注销后点击页面上的返回按钮显示上一页内容?