Я намагаюся використовувати 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 із заголовками кеш-контролю
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 прочитав відповідь з кешу?
EDIT:
Оскільки OKHttp 2.0.x HttpResponseCache
є Cache
, setResponseCache
єsetCache
Cache-Control: s-maxage=1209600, max-age=1209600
я не знаю, чи достатньо.
public
ключове слово потрібно було у заголовку відповіді, щоб воно працювало в режимі офлайн. Але ці заголовки не дозволяють OkClient використовувати мережу, коли вона доступна. Чи є можливість встановити кеш-політику / стратегію для використання мережі, коли вона є?
max-stale + max-age
це передано, він робить запит від мережі. Але я хочу встановити max-stale на тиждень. Це змушує читати відповідь з кешу, навіть якщо є мережа.