[英]How to Cache the response in squareup.okhttp3
I am trying to cache the http response through OKhttp but unable to find some good example or documentation. 我试图通过OKhttp缓存http响应,但无法找到一些好的示例或文档。
Thanks for any help 谢谢你的帮助
this will cache all your response for 2 minutes 这将缓存您的所有响应2分钟
OkHttpClient provideOkHttpClient () {
Cache cache = new Cache(new File(context.getCacheDir(), "http-cache"), 10 * 1024 * 1024);
return new OkHttpClient.Builder()
.addNetworkInterceptor(provideCacheInterceptor())
.cache(cache)
.build();
}
Interceptor provideCacheInterceptor () {
return new Interceptor() {
@Override
public Response intercept (Chain chain) throws IOException {
Response response = chain.proceed( chain.request() );
CacheControl cacheControl = new CacheControl.Builder()
.maxAge( 2, TimeUnit.MINUTES )
.build();
return response.newBuilder()
.header("Cache-Control", cacheControl.toString() )
.build();
}
};
}
public final class FeedInterceptor {
private final static String TAG = FeedInterceptor.class.getSimpleName();
/**
* Validate cache, return stream. Return cache if no network.
* @param context
* @return
*/
public static Interceptor getOnlineInterceptor(final Context context){
Interceptor interceptor = new Interceptor() {
@Override
public Response intercept(Chain chain) throws IOException {
Response response = chain.proceed(chain.request());
String headers = response.header("Cache-Control");
if(NetworkUtils.isConnected(context) && (headers == null
|| headers.contains("no-store")
|| headers.contains("must-revalidate")
|| headers.contains("no-cache")
|| headers.contains("max-age=0"))) {
LOGD(TAG, "Returning fresh response");
return response.newBuilder()
.header("Cache-Control", "public, max-age=600")
.build();
} else{
LOGD(TAG, "Returning old response");
return response;
}
}
};
return interceptor;
}
/**
* Get me cache.
* @param context
* @return
*/
public static Interceptor getOfflineInterceptor(final Context context){
Interceptor interceptor = new Interceptor() {
@Override
public Response intercept(Chain chain) throws IOException {
Request request = chain.request();
if(!NetworkUtils.isConnected(context)){
request = request.newBuilder()
.header("Cache-Control", "public, only-if-cached")
.build();
}
return chain.proceed(request);
}
};
return interceptor;
}
} // End FeedInterceptor
And the client: 和客户:
private OkHttpClient createCacheClient(Context context){
File httpCacheDirecotory = new File(context.getCacheDir(), FILE);
Cache cache = new Cache(httpCacheDirecotory, CACHE_SIZE);
return new OkHttpClient.Builder()
.addNetworkInterceptor(FeedInterceptor.getOnlineInterceptor(context))
.addInterceptor(FeedInterceptor.getOfflineInterceptor(context))
.cache(cache)
.build();
}
There is a sample here CacheResponse.java 这里有一个示例CacheResponse.java
Cache cache = new Cache(cacheDirectory, cacheSize);
client = new OkHttpClient.Builder()
.cache(cache)
.build();
The javadoc for Cache has examples for forcing fresh or cached responses. Cache的javadoc包含强制新响应或缓存响应的示例。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.