Kann mit OKHttp Nutzung Cache-Daten im Offline- Nachrüstung

? osrl @ | Original: StackOverFlow
---

Ich versuche, Retrofit & amp zu verwenden; OKHttp um HTTP-Antworten zwischenspeichern. Ich fallowed https://gist.github.com/swankjesse/5889518 und, am Ende mit diesem 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);

Und das ist MyApi mit den Cache-Control -Header

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

Zunächst bitte ich online und überprüfen Sie die Cache-Dateien . Die richtige JSON-Antwort und Header sind da. Aber wenn ich versuche offline zu verlangen, habe ich immer bekommen RetrofitError Unknown . Gibt es etwas, was ich tun sollte, um Retrofit lesen Sie die Antwort aus dem Cache ?

EDIT: Seit OKHttp 2.0.x HttpResponseCache ist Cache, setResponseCache ist setCache

---

Top 5 Antwort

1osrl @

Es stellt sich heraus, dass Server-Antwort muss Cache-Control: public, um OkClient, um aus dem Cache zu lesen.

Auch Wenn Du Netz anzufordern wollen, wenn verfügbar, sollten Sie Request-Header hinzufügen Cache-Control: max-age=0 . http://stackoverflow.com/a/20493369/1120126 zeigt, wie man es zu tun parametriert . Dies ist, wie ich es benutzt :

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