Pode Retrofit com dados de uso de cache OKHttp em modo offline

? osrl @ | Original: StackOverFlow
---

Eu estou tentando usar Retrofit & amp; OKHttp para armazenar em cache respostas HTTP . I pousio https://gist.github.com/swankjesse/5889518 e, acabamos 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 este é MyApi com os cabeçalhos 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
   );

Primeiro eu solicitar on-line e verificar os arquivos de cache . A resposta correta e cabeçalhos JSON estão lá. Mas quando tentar pedir off-line, eu sempre chegar RetrofitError UnknownHostException . Existe alguma coisa que eu deveria fazer para Retrofit ler a resposta do cache?

EDIT: Desde OKHttp 2.0.x HttpResponseCache é Cache, setResponseCache é setCache

---

Top 5 Responder

1osrl @

Acontece que a resposta do servidor deve ter Cache-Control: public para fazer OkClient para ler a partir de cache.

Também Se você quiser solicitar a rede quando estiver disponível, você deve adicionar Cache-Control: max-age=0 cabeçalho do pedido . http://stackoverflow.com/a/20493369/1120126 mostra como fazê-lo com parâmetros. É assim que eu usei :

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);
            }
        }
});