Può Retrofit con i dati della cache OKHttp uso in modalità offline

? osrl @ | Original: StackOverFlow
---

Sto cercando di usare Retrofit & amp ; OKHttp di memorizzare nella cache risposte HTTP . Io a riposo https://gist.github.com/swankjesse/5889518 e, finito con questo codice :

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 questo è MyApi con le intestazioni 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
   );

Innanzitutto chiedo online e controllare i file della cache . La risposta e le intestazioni JSON corretta ci sono . Ma quando una richiesta in linea, ho sempre arrivare RetrofitError UnknownHostException . C'è qualcos'altro che dovrei fare per rendere Retrofit leggere la risposta dalla cache ?

EDIT : Dal OKHttp 2.0.x HttpResponseCache è Cache, setResponseCache è setCache

---

Top 5 Risposta

1osrl @

Si scopre che la risposta del server deve avere Cache-Control: public fare OkClient per leggere dalla cache .

Anche se si desidera richiedere dalla rete quando disponibili, si dovrebbe aggiungere Cache-Control: max-age=0 richiesta di intestazione . http://stackoverflow.com/a/20493369/1120126 mostra come farlo con parametri. Ecco come l'ho usato :

RestAdapter.Builder builder= new RestAdapter.Builder()
   .setRequestInterceptor(new RequestInterceptor() {
        @Override
        public void intercept(RequestFacade request) {
            request.addHeader("Accept", "application/json;versions=1");
            if (MyApplicationUtils.isNetworkAvaliable(context)) {
                int maxAge = 60; // read from cache for 1 minute
                request.addHeader("Cache-Control", "public, max-age=" + maxAge);
            } else {
                int maxStale = 60 * 60 * 24 * 28; // tolerate 4-weeks stale
                request.addHeader("Cache-Control", 
                    "public, only-if-cached, max-stale=" + maxStale);
            }
        }
});