Retrofit&OKHttpを使用してHTTP応答をキャッシュしようとしています。私はこの要点をたどり、次のコードで終わりました:
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);
そして、これはCache-Controlヘッダーを持つMyApiです。
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
ます。Retrofitにキャッシュからの応答を読み取らせるために他にすべきことはありますか?
EDIT:
OKHttp 2.0.xのがあるのでHttpResponseCache
ありCache
、setResponseCache
さsetCache
Cache-Control: s-maxage=1209600, max-age=1209600
十分かどうかはわかりませんが、これを返します。
public
オフラインで機能させるには、キーワードが応答ヘッダーに含まれている必要があるようです。ただし、これらのヘッダーでは、利用可能な場合、OkClientはネットワークを使用できません。とにかく、ネットワークを使用できるようにキャッシュポリシー/戦略を設定する方法はありますか?
max-stale + max-age
渡された場合、ネットワークからのリクエストを行います。しかし、私はmax-staleを週に設定したいと思います。これにより、ネットワークが利用可能であっても、キャッシュから応答を読み取ります。