我试图通过OKhttp缓存http响应 但无法找到一些好的例子或文档。
感谢您的帮助
答案 0 :(得分:7)
这会将所有回复缓存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();
}
};
}
答案 1 :(得分:7)
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
和客户:
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();
}
答案 2 :(得分:2)
此处有一个示例since version 9.0.0
Cache cache = new Cache(cacheDirectory, cacheSize);
client = new OkHttpClient.Builder()
.cache(cache)
.build();
CacheResponse.java包含强制新响应或缓存响应的示例。