Я пытаюсь использовать Retrofit & OKHttp для кэширования HTTP-ответов. Я следовал этой сути и, в конечном итоге, с этим кодом:
File httpCacheDirectory = new File(context.getCacheDir(), "responses");
HttpResponseCache httpResponseCache = null;
try {
httpResponseCache = new HttpResponseCache(httpCacheDirectory, 10 * 1024 * 1024);
} catch (IOException e) {
Log.e("Retrofit", "Could not create http cache", e);
}
OkHttpClient okHttpClient = new OkHttpClient();
okHttpClient.setResponseCache(httpResponseCache);
api = new RestAdapter.Builder()
.setEndpoint(API_URL)
.setLogLevel(RestAdapter.LogLevel.FULL)
.setClient(new OkClient(okHttpClient))
.build()
.create(MyApi.class);
И это MyApi с заголовками Cache-Control
public interface MyApi {
@Headers("Cache-Control: public, max-age=640000, s-maxage=640000 , max-stale=2419200")
@GET("/api/v1/person/1/")
void requestPerson(
Callback<Person> callback
);
Сначала я запрашиваю онлайн и проверяю файлы кеша. Правильный ответ JSON и заголовки там. Но когда я пытаюсь запросить в автономном режиме, я всегда получаю RetrofitError UnknownHostException
. Что еще я должен сделать, чтобы Retrofit прочитал ответ из кеша?
РЕДАКТИРОВАТЬ:
Так как OKHttp 2.0.x HttpResponseCache
есть Cache
, setResponseCache
естьsetCache
Cache-Control: s-maxage=1209600, max-age=1209600
я не знаю, достаточно ли этого.
public
ключевое слово нужно было в заголовке ответа, чтобы оно работало в автономном режиме. Но эти заголовки не позволяют OkClient использовать сеть, когда она доступна. Есть ли способ установить политику / стратегию кэширования для использования сети, когда она доступна?
max-stale + max-age
пропущен, он делает запрос из сети. Но я хочу установить max-stale неделю. Это делает чтение ответа из кэша, даже если сеть доступна.