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에서 캐시의 응답을 읽도록하기 위해해야 할 다른 작업이 있습니까?
편집 :
OKHttp 2.0.x에서이 때문에 HttpResponseCache
입니다 Cache
, setResponseCache
이다setCache
Cache-Control: s-maxage=1209600, max-age=1209600
충분한 지 모르겠다.
public
키워드가 오프라인에서 작동하려면 응답 헤더에 있어야했던 것 같습니다 . 그러나 이러한 헤더를 사용하면 OkClient에서 네트워크를 사용할 수 없습니다. 사용 가능한 경우 네트워크를 사용하도록 캐시 정책 / 전략을 설정해야합니까?
max-stale + max-age
전달, 그것은 네트워크의 요청을 수행합니다. 그러나 일주일에 최대 이야기를 설정하고 싶습니다. 이것은 사용 가능한 네트워크가 있더라도 캐시에서 응답을 읽습니다.