मैं HTTP प्रतिक्रियाओं का कैश करने के लिए Retrofit और OKHttp का उपयोग करने की कोशिश कर रहा हूं। मैंने इस जिस्ट का अनुसरण किया और इस कोड के साथ समाप्त हुआ:
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
। क्या मुझे कैश से प्रतिक्रिया पढ़ने के लिए कुछ और करना चाहिए?
संपादित करें:
चूंकि OKHttp 2.0.x HttpResponseCache
है Cache
, setResponseCache
हैsetCache
Cache-Control: s-maxage=1209600, max-age=1209600
अगर यह काफी है मैं नहीं जानता।
public
कीवर्ड को ऑफ़लाइन करने के लिए प्रतिक्रिया हेडर में होना चाहिए था। लेकिन, ये हेडर उपलब्ध होने पर OkClient को नेटवर्क का उपयोग करने की अनुमति नहीं देता है। उपलब्ध होने पर नेटवर्क का उपयोग करने के लिए कैश पॉलिसी / रणनीति निर्धारित करने के लिए वैसे भी क्या है?
max-stale + max-age
पारित हो जाता है, तो यह नेटवर्क से अनुरोध करता है। लेकिन मैं एक सप्ताह में अधिकतम-बासी सेट करना चाहता हूं। यह नेटवर्क उपलब्ध है, भले ही यह कैश से प्रतिक्रिया पढ़ें।