J'essaie d'utiliser Retrofit & OKHttp pour mettre en cache les réponses HTTP. J'ai suivi l'essentiel et j'ai fini avec ce code:
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);
Et voici MyApi avec les en-têtes 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
);
Je demande d'abord en ligne et vérifie les fichiers de cache. La réponse et les en-têtes JSON corrects sont là. Mais lorsque j'essaie de demander hors ligne, je reçois toujours RetrofitError UnknownHostException
. Dois-je faire autre chose pour que Retrofit lise la réponse à partir du cache?
EDIT:
Puisque OKHttp 2.0.x HttpResponseCache
est Cache
, setResponseCache
estsetCache
Cache-Control: s-maxage=1209600, max-age=1209600
je ne sais pas si ça suffit.
public
mot - clé devait être dans l'en-tête de réponse pour le faire fonctionner hors ligne. Mais ces en-têtes ne permettent pas à OkClient d'utiliser le réseau lorsqu'il est disponible. Est-il possible de définir une politique / stratégie de cache pour utiliser le réseau lorsqu'il est disponible?
max-stale + max-age
est passé, il demande au réseau. Mais je veux définir max-stale une semaine. Cela permet de lire la réponse du cache même si un réseau est disponible.