Retorfit2和OkHttp3缓存

Retorfit2和OkHttp3缓存

需求如下:当用户在有网络的情况下,设置一个”缓冲时间”,比如在请求了一次网络数据之后,接下来60s内进行网络请求其实是拿的缓存,这样做可以减少服务器负担,节约流量.
当无网络时,用缓存读取数据,数据默认保存2周.这样就可以进行离线阅读.

1.首先来配置拦截器

配置好时间等属性,再结合判断是否有网络来进行设置

public class RewriteCacheControlInterceptor implements Interceptor {

    private Context mContext;
    /**
     * 无网络,设缓存有效期为两周
     */
    private static final long CACHE_STALE_SEC = 60 * 60 * 24 * 14;
    /**
     * 有网 缓存60s
     */
    private static final long MAX_AGE = 60;

    public RewriteCacheControlInterceptor(Context context) {
        this.mContext = context;
    }

    @Override
    public Response intercept(Chain chain) throws IOException {
        Request request = chain.request();
        String cacheControl = request.cacheControl().toString();
        if (!DevicesUtils.hasNetworkConnected(mContext)) {
            request = request.newBuilder()
                    .cacheControl(TextUtils.isEmpty(cacheControl) ? CacheControl.FORCE_CACHE :
                            CacheControl.FORCE_NETWORK)
                    .build();
        }
        Response originalResponse = chain.proceed(request);
        if (DevicesUtils.hasNetworkConnected(mContext)) {
            //有网的时候连接服务器请求,缓存60s
            return originalResponse.newBuilder()
                    .header("Cache-Control", "public, max-age=" + MAX_AGE)
                    .removeHeader("Pragma")
                    .build();
        } else {
            //网络断开时读取缓存
            return originalResponse.newBuilder()
                    .header("Cache-Control", "public, only-if-cached, max-stale=" + CACHE_STALE_SEC)
                    .removeHeader("Pragma")
                    .build();
        }
    }
}

2. 初始化OkHttp3

将拦截器设置进去即可.

/**
* 初始化OkHttp
*/
public static void initOkHttp(Context context) {
    //拦截器
    RewriteCacheControlInterceptor mRewriteCacheControlInterceptor = new
            RewriteCacheControlInterceptor(context);

    //缓存文件
    File cacheFile = context.getCacheDir();
    //设置缓存大小
    Cache cache = new Cache(cacheFile, MAX_CACHE_SIZE);
    if (cacheFile != null) {
        okHttpClient = new OkHttpClient.Builder()
                //超时设置
                .readTimeout(READ_TIME_OUT, TimeUnit.SECONDS)
                .connectTimeout(CONNECT_TIME_OUT, TimeUnit.SECONDS)
                //错误重连
                .retryOnConnectionFailure(true)
                //拦截器
                .addNetworkInterceptor(mRewriteCacheControlInterceptor)
                .addInterceptor(mRewriteCacheControlInterceptor)
                //缓存
                .cache(cache)
                .build();
    } else {
        okHttpClient = new OkHttpClient.Builder().build();
    }

}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值