使用 Okhttp3.0 和 retrofit2 缓存网络请求
Caching network requests with Okhttp3.0 and retrofit2
我在 android 应用程序中使用 Retrofit2 和 OKHTTP3 for REST API。我的要求是我必须缓存请求以在离线模式下使用应用程序。问题是我能够缓存请求。但是当用户再次上线时,应该从后端重新获取数据,而不应该为缓存的响应提供服务。我怎样才能做到这一点。下面是我的网络拦截器
网络拦截器
public class CachingInterceptor implements Interceptor {
@Override
public Response intercept(Chain chain) throws IOException {
Request request = chain.request();
if (Util.isOnline()) {
request = request.newBuilder()
.header("Cache-Control", "only-if-cached")
.build();
} else {
request = request.newBuilder()
.header("Cache-Control", "public, max-stale=2419200")
.build();
}
Response response= chain.proceed(request);
return response.newBuilder()
.header("Cache-Control", "max-age=86400")
.build();
}
}
参考这个答案link
OkHttp拦截器是离线访问缓存的正确方式:
知道了。如果设备处于离线状态,我将 Cache-Control header 设置为 "public, only-if-cached, max-stale=86400"(这将将陈旧时间设置为 1 天)。现在,如果设备在线,它将从服务器重新获取。
OkHttpClient
okHttpClient = new OkHttpClient.Builder()
.addInterceptor(new OfflineCachingInterceptor())
.cache(cache)
.build();
OfflineCachingInterceptor
public class OfflineCachingInterceptor implements Interceptor {
@Override
public Response intercept(Chain chain) throws IOException {
Request request = chain.request();
//Checking if the device is online
if (!(Util.isOnline())) {
// 1 day stale
int maxStale = 86400;
request = request.newBuilder()
.header("Cache-Control", "public, only-if-cached, max-stale=" + maxStale)
.build();
}
return chain.proceed(request);
}
}
我在 android 应用程序中使用 Retrofit2 和 OKHTTP3 for REST API。我的要求是我必须缓存请求以在离线模式下使用应用程序。问题是我能够缓存请求。但是当用户再次上线时,应该从后端重新获取数据,而不应该为缓存的响应提供服务。我怎样才能做到这一点。下面是我的网络拦截器
网络拦截器
public class CachingInterceptor implements Interceptor {
@Override
public Response intercept(Chain chain) throws IOException {
Request request = chain.request();
if (Util.isOnline()) {
request = request.newBuilder()
.header("Cache-Control", "only-if-cached")
.build();
} else {
request = request.newBuilder()
.header("Cache-Control", "public, max-stale=2419200")
.build();
}
Response response= chain.proceed(request);
return response.newBuilder()
.header("Cache-Control", "max-age=86400")
.build();
}
}
参考这个答案link OkHttp拦截器是离线访问缓存的正确方式:
知道了。如果设备处于离线状态,我将 Cache-Control header 设置为 "public, only-if-cached, max-stale=86400"(这将将陈旧时间设置为 1 天)。现在,如果设备在线,它将从服务器重新获取。
OkHttpClient
okHttpClient = new OkHttpClient.Builder()
.addInterceptor(new OfflineCachingInterceptor())
.cache(cache)
.build();
OfflineCachingInterceptor
public class OfflineCachingInterceptor implements Interceptor {
@Override
public Response intercept(Chain chain) throws IOException {
Request request = chain.request();
//Checking if the device is online
if (!(Util.isOnline())) {
// 1 day stale
int maxStale = 86400;
request = request.newBuilder()
.header("Cache-Control", "public, only-if-cached, max-stale=" + maxStale)
.build();
}
return chain.proceed(request);
}
}