我正在尝试使用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);
这是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
。我还需要做些其他事情来使Retrofit从缓存中读取响应吗?
编辑:
由于OKHttp 2.0.x HttpResponseCache
是Cache
,setResponseCache
是setCache
Cache-Control: s-maxage=1209600, max-age=1209600
我不知道是否足够。
public
关键字需要在响应标头中才能使其脱机工作。但是,这些标头不允许OkClient在可用时使用网络。无论如何,是否可以将缓存策略/策略设置为在可用时使用网络?
max-stale + max-age
通过,它确实会从网络发出请求。但我想设置一个最大过时的一周。即使有可用的网络,它也会从缓存中读取响应。