Próbuję użyć Retrofit & OKHttp do buforowania odpowiedzi HTTP. Podążałem za tym sednem i skończyłem z tym kodem:
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);
A to jest MyApi z nagłówkami 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
);
Najpierw żądam online i sprawdzam pliki pamięci podręcznej. Znajduje się tam poprawna odpowiedź JSON i nagłówki. Ale kiedy próbuję poprosić o dostęp offline, zawsze otrzymuję RetrofitError UnknownHostException
. Czy jest jeszcze coś, co powinienem zrobić, aby Retrofit odczytywał odpowiedź z pamięci podręcznej?
EDYCJA:
Ponieważ OKHttp 2.0.x HttpResponseCache
jest Cache
, setResponseCache
jestsetCache
Cache-Control: s-maxage=1209600, max-age=1209600
, nie wiem, czy to wystarczy.
public
słowo kluczowe musiało znajdować się w nagłówku odpowiedzi, aby działało w trybie offline. Ale te nagłówki nie pozwalają OkClient na korzystanie z sieci, gdy jest dostępna. Czy mimo to można ustawić zasady / strategię pamięci podręcznej w celu korzystania z sieci, gdy jest dostępna?
max-stale + max-age
zostanie przekazane, żąda z sieci. Ale chcę ustawić maksymalny czas na tydzień. To sprawia, że odczytuje odpowiedź z pamięci podręcznej, nawet jeśli jest dostępna sieć.