Ich versuche, Retrofit & OKHttp zum Zwischenspeichern von HTTP-Antworten zu verwenden. Ich folgte diesem Kern und endete 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-Headern
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
);
Zuerst fordere ich online an und überprüfe die Cache-Dateien. Die richtige JSON-Antwort und die richtigen Header sind vorhanden. Aber wenn ich versuche, offline anzufordern, bekomme ich immer RetrofitError UnknownHostException
. Gibt es noch etwas, das ich tun sollte, damit Retrofit die Antwort aus dem Cache liest?
EDIT:
Da OKHttp 2.0.x HttpResponseCache
ist Cache
, setResponseCache
istsetCache
Cache-Control: s-maxage=1209600, max-age=1209600
Ich weiß nicht , ob es genug ist.
public
Schlüsselwort im Antwortheader enthalten sein musste, damit es offline funktioniert. Mit diesen Headern kann OkClient das Netzwerk jedoch nicht verwenden, wenn es verfügbar ist. Gibt es überhaupt eine Möglichkeit, die Cache-Richtlinie / -Strategie für die Verwendung des Netzwerks festzulegen, wenn diese verfügbar ist?
max-stale + max-age
übergeben, wird vom Netzwerk angefordert. Aber ich möchte maximal eine Woche alt werden. Dadurch wird die Antwort aus dem Cache gelesen, auch wenn ein Netzwerk verfügbar ist.