我阅读了数十个教程和 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://new Fivefour.com/android-retrofit2-okhttp3-cache-network-request-offline.html https://newfivefour.com/android-retrofit2-okhttp3-cache-network-request-offline.html(一个拦截器,不起作用!!)
https://medium.com/mindorks/caching-with-retrofit-store-responses-offline-71439ed32fda https://medium.com/mindorks/caching-with-retrofit-store-responses-offline-71439ed32fda(一个拦截器,不起作用!)
https://caster.io/lessons/retrofit-2-offline-cache https://caster.io/lessons/retrofit-2-offline-cache(单独的在线+离线缓存,不起作用)
https://www.journaldev.com/23297/android-retrofit-okhttp-offline-caching https://www.journaldev.com/23297/android-retrofit-okhttp-offline-caching(不工作,504 不可满足的请求(仅当缓存时))
http://mikescamell.com/gotcha-when-offline-caching-with-okhttp3/ http://mikescamell.com/gotcha-when-offline-caching-with-okhttp3/(一个拦截器,不起作用!!)
https://stackoverflow.com/a/48295397/8086424 https://stackoverflow.com/a/48295397/8086424(不工作)
无法解析主机“jsonplaceholder.typicode.com”:没有与主机名关联的地址
用 OKHttp 进行 Retrofit 离线时可以使用缓存数据吗 https://stackoverflow.com/questions/23429046/can-retrofit-with-okhttp-use-cache-data-when-offline(太混乱了!)
这是我的代码:
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();
}
};
}
我正在使用 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