Estoy tratando de usar Retrofit y OKHttp para almacenar en caché las respuestas HTTP. Seguí esta esencia y terminé con 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);
Y este es MyApi con los encabezados 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
);
Primero solicito en línea y verifico los archivos de caché. La respuesta correcta JSON y los encabezados están ahí. Pero cuando trato de solicitar fuera de línea, siempre obtengo RetrofitError UnknownHostException
. ¿Hay algo más que deba hacer para que Retrofit lea la respuesta del caché?
EDITAR:
ya que OKHttp 2.0.x HttpResponseCache
es Cache
, setResponseCache
essetCache
Cache-Control: s-maxage=1209600, max-age=1209600
, no sé si es suficiente.
public
palabra clave era necesaria para estar en el encabezado de respuesta para que funcione sin conexión. Pero, estos encabezados no permiten que OkClient use la red cuando está disponible. ¿Hay alguna forma de establecer una política / estrategia de caché para usar la red cuando esté disponible?
max-stale + max-age
se pasa, se solicita de la red. Pero quiero establecer max-stale a la semana. Esto hace que lea la respuesta del caché incluso si hay una red disponible.