ฉันพยายามใช้ 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 ที่มีส่วนหัวควบคุมแคช
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
ผ่านมันจะขอจากเครือข่าย แต่ฉันต้องการตั้งค่าสูงสุดค้างหนึ่งสัปดาห์ สิ่งนี้ทำให้อ่านการตอบสนองจากแคชแม้ว่าจะมีเครือข่าย