Можете модифицировать с OKHttp данных использование кэша в автономном режиме

? osrl @ | Original: StackOverFlow
---

Я пытаюсь использовать Дооснащение & Amp; OKHttp кэшировать запросы HTTP . Я под паром https://gist.github.com/swankjesse/5889518 и в конечном итоге с этого кода :

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

И это MyAPI с заголовками 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
   );

Сначала я прошу в интернет и проверить кэш-файлы . Правильный ответ и заголовки JSON есть . Но при попытке запросить в автономном режиме, я всегда получаю RetrofitError UnknownHostException . Есть что-нибудь еще я должен сделать, чтобы Реконструкция прочитать ответ из кэша ?

EDIT: С OKHttp 2.0.x HttpResponseCache является Cache, setResponseCache является setCache

---

Top 5 ответ

1osrl @

Оказывается, что ответ сервер должен иметь Cache-Control: public сделать OkClient для чтения из кэша.

Кроме того, если вы хотите, чтобы потребовать от сети при наличии, вы должны добавить Cache-Control: max-age=0 заголовка запроса . http://stackoverflow.com/a/20493369/1120126 показывает, как это сделать параметризованных . Это, как я использовал его :

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