Я прочитал десятки уроков и Stackoverflow ответы на мою проблему, но ничего не работает для меня!Кроме того, большинство из них старые, поэтому, вероятно, OKHTTP как-то изменился.
Все, что я хочу, это включить автономное кэширование для модернизации.
Я использую GET
Я пытался использовать только offlineCacheInterceptor
в качестве перехватчика, но получал:
Unable to resolve host "jsonplaceholder.typicode.com": No address associated with hostname
Я пытался использовать комбинацию offlineCacheInterceptor
в качестве перехватчика + provideCacheInterceptor()
в качествеNetworkInterceptor, но я продолжал получать:
504 Unsatisfiable Request (only-if-cached) and a null response.body()
Я даже удостоверился, что добавил .removeHeader("Pragma")
везде!
Я попробовал все эти ссылки:
https://newfivefour.com/android-retrofit2-okhttp3-cache-network-request-offline.html (один перехватчик, не работает !!)
https://medium.com/mindorks/caching-with-retrofit-store-responses-offline-71439ed32fda (один перехватчик, не работает!)
https://caster.io/lessons/retrofit-2-offline-cache (отдельный онлайн +Кэширование в автономном режиме, не работает)
https://www.journaldev.com/23297/android-retrofit-okhttp-offline-caching (не работает, 504 неудовлетворительный запрос (только при кэшировании))
http://mikescamell.com/gotcha-when-offline-caching-with-okhttp3/ (один перехватчик, неработает !!)
https://stackoverflow.com/a/48295397/8086424 (не работает) Невозможно разрешить хост "jsonplaceholder.typicode.com": нет адреса, связанного с именем хоста
Можно модифицировать с помощью OKHttpиспользовать CAче данные в оффлайне (СЛИШКОМ сбивает с толку!)
Вот мой код:
public static Retrofit getRetrofitInstance(Context context) {
if (retrofit == null) {
c = context;
int cacheSize = 10 * 1024 * 1024; // 10 MB
Cache cache = new Cache(context.getCacheDir(), cacheSize);
OkHttpClient okHttpClient = new OkHttpClient.Builder()
.addInterceptor(provideHttpLoggingInterceptor())
.addInterceptor(offlineCacheInterceptor)
.addNetworkInterceptor(provideCacheInterceptor())
.cache(cache)
.build();
//////////////////////////
retrofit = new retrofit2.Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.client(okHttpClient)
.build();
}
return retrofit;
}
public static Interceptor offlineCacheInterceptor = new Interceptor() {
@Override
public Response intercept(Chain chain) throws IOException {
Request request = chain.request();
Log.e("bbbb", "bbbb");
if (!checkInternetAvailability()) {
Log.e("aaaaa", "aaaaaa");
CacheControl cacheControl = new CacheControl.Builder()
.maxStale(30, TimeUnit.DAYS)
.build();
request = request.newBuilder()
.cacheControl(cacheControl)
.removeHeader("Pragma")
.build();
}
return chain.proceed(request);
}
};
public static Interceptor provideCacheInterceptor() {
return new Interceptor() {
@Override
public Response intercept(Chain chain) throws IOException {
Response response = chain.proceed(chain.request());
// re-write response header to force use of cache
CacheControl cacheControl = new CacheControl.Builder()
.maxAge(2, TimeUnit.MINUTES)
.build();
return response.newBuilder()
.header(CACHE_CONTROL, cacheControl.toString())
.removeHeader("Pragma")
.build();
}
};
}
IЯ использую jsonplaceholder.typicode.com/photos, который возвращает:
content-type: application/json; charset=utf-8
date: Sun, 21 Oct 2018 14:26:41 GMT
set-cookie: __cfduid=d9e935012d2f789245b1e2599a41e47511540132001; expires=Mon, 21-Oct-19 14:26:41 GMT; path=/; domain=.typicode.com; HttpOnly
x-powered-by: Express
vary: Origin, Accept-Encoding
access-control-allow-credentials: true
expires: Sun, 21 Oct 2018 18:26:41 GMT
x-content-type-options: nosniff
etag: W/"105970-HCYFejK2YCxztz8++2rHnutkPOQ"
via: 1.1 vegur
cf-cache-status: REVALIDATED
expect-ct: max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
server: cloudflare
cf-ray: 46d466910cab3d77-MXP
Cache-Control: public, max-age=60