Estou tentando usar o Retrofit & OKHttp para armazenar em cache as respostas HTTP. Eu segui essa essência e, acabei com este código:
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);
E esse é o MyApi com os cabeçalhos de controle de cache
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
);
Primeiro solicito on-line e verifico os arquivos de cache. A resposta JSON correta e os cabeçalhos estão lá. Mas quando tento solicitar offline, sempre entendo RetrofitError UnknownHostException
. Há mais alguma coisa que devo fazer para fazer com que o Retrofit leia a resposta do cache?
EDIT:
Como OKHttp 2.0.x HttpResponseCache
é Cache
, setResponseCache
ésetCache
Cache-Control: s-maxage=1209600, max-age=1209600
, não sei se é suficiente.
public
palavra - chave precisava estar no cabeçalho de resposta para fazê-la funcionar offline. Porém, esses cabeçalhos não permitem que o OkClient use a rede quando houver disponível. Existe alguma maneira de definir a política / estratégia de cache para usar a rede quando disponível?
max-stale + max-age
passado, ele solicita da rede. Mas quero definir o máximo de uma semana. Isso faz com que leia a resposta do cache, mesmo se houver rede disponível.