我读了很多教程和StackOverflow对我的问题的答案,但是没有什么对我有用!而且,它们中的大多数都是旧的,所以OKHTTP可能以某种方式发生了变化。
我只想启用
脱机缓存
用于改装。
我用的是GET
我只想用
offlineCacheInterceptor
作为一个拦截器,但我不断得到:
Unable to resolve host "jsonplaceholder.typicode.com": No address associated with hostname
我试着结合使用
脱机缓存拦截器
作为拦截器+
provideCacheInterceptor()
作为一个网络拦截器,但我不断得到:
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”:没有与主机名关联的地址
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