Как обновить кэш OkHttp
В моем приложении для Android я кеширую ответы с сервера, используя OkHttp. для этого я реализовал код следующим образом
private class CacheInterceptor implements Interceptor {
Context mContext;
public CacheInterceptor(Context context) {
this.mContext = context;
}
@Override
public Response intercept(Chain chain) throws IOException {
Request request = chain.request();
request = request.newBuilder()
.header(HEADER_MOBILE_OS, Constants.MOBILE_OS)
.header(HEADER_APP_VERSION, BuildConfig.VERSION_NAME)
.build();
Response response = chain.proceed(request);
if (!mShouldUpdateCache) {
response.newBuilder()
.header("Cache-Control", String.format("max-age=%d", CACHE_MAX_AGE)).build();
} else {
//update cache in this case
response.newBuilder()
.header("Cache-Control", "no-cache").build();
mShouldUpdateCache = false;
}
return response;
}
}
это мой класс перехватчика, и я устанавливаю это в OkClient следующим образом
okHttpClient.networkInterceptors().add(new CacheInterceptor(context));
File httpCacheDirectory = new File(context.getCacheDir(), "response_cache");
Cache cache = new Cache(httpCacheDirectory, CACHE_SIZE);
if (cache != null) {
okHttpClient.setCache(cache);
}
но проблема в том, когда логическое mShouldUpdateCache
становится истинным, я должен обновить кэш. сейчас я написал response.newBuilder().header("Cache-Control", "no-cache").build();
но это не обновление кеша и не выборка с сервера, как мне решить эту проблему?
1 ответ
Я подозреваю, что ваш сетевой перехватчик не выполняется для ответов, отправляемых из кэша, потому что сеть не используется для этих запросов. Из документа перехватчиков сетевые перехватчики "не вызываются для кэшированных ответов, которые закорачивают сеть".
Взлом заголовков ответов на клиенте - хрупкий способ кэширования HTTP. Вы должны использовать соответствующие заголовки запроса и заставить свой веб-сервер установить соответствующие заголовки ответа.