Tôi đang cố gắng sử dụng Retrofit & OKHttp để lưu các phản hồi HTTP. Tôi đã theo ý chính này và, kết thúc với mã này:
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);
Và đây là MyApi với các tiêu đề 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
);
Đầu tiên tôi yêu cầu trực tuyến và kiểm tra các tập tin bộ nhớ cache. Phản hồi và tiêu đề JSON chính xác là có. Nhưng khi tôi cố gắng yêu cầu ngoại tuyến, tôi luôn nhận được RetrofitError UnknownHostException
. Có điều gì khác tôi nên làm để Retrofit đọc phản hồi từ bộ đệm không?
EDIT:
Vì OKHttp 2.0.x HttpResponseCache
là Cache
, setResponseCache
làsetCache
Cache-Control: s-maxage=1209600, max-age=1209600
tôi không biết nếu nó đủ.
public
từ khóa là cần thiết trong tiêu đề phản hồi để làm cho nó hoạt động ngoại tuyến. Nhưng, những tiêu đề này không cho phép OkClient sử dụng mạng khi có sẵn. Có cách nào để thiết lập chính sách / chiến lược bộ đệm để sử dụng mạng khi khả dụng không?
max-stale + max-age
được thông qua, nó không yêu cầu từ mạng. Nhưng tôi muốn thiết lập tối đa một tuần. Điều này làm cho nó đọc phản hồi từ bộ đệm ngay cả khi có mạng.