Кеш okhttp: как сначала получить данные кеша, а затем получить сетевые данные в сети? - PullRequest
0 голосов
/ 15 мая 2018

ref: https://github.com/square/okhttp/issues/4003

Большинство решений - это сети с сетевыми запросами, без сетевого кеша запросов.Мое требование - сначала запросить кеш в сети, а затем запросить сеть.THX !!!!

Я пытаюсь, как это:

 @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;
}

1 Ответ

0 голосов
/ 24 июня 2018

Попробуйте использовать 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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...