开发者社区> 问答> 正文

retrofit框架怎么实现一次请求先返回缓存数据,在返回网络数据?? 400 报错

retrofit框架怎么实现一次请求先返回缓存数据,在返回网络数据?? 400 报错

现在有一个需求,不管网络是否可用,先加载本地缓存,如果网络可用,同时请求网络数据,成功返回的话就展示最新数据。这样提高了用户体验,不至于网络差的情况页面一片空白。但是retrofit这个框架好像不能实现,它是通过添加拦截器实现自定义缓存,一次请求,要么返回缓存数据,要么返回网络数据,不能同时返回两者,代码如下:

**
 * 缓存策略
 */
private static final Interceptor cacheControlInterceptor = new Interceptor() {

    @Override
    public Response intercept(Chain chain) throws IOException {
        Request request = chain.request();
        if (!NetWorkUtils.isNetworkAvailable(GApp.getInstance())) {
            request = request.newBuilder().cacheControl(CacheControl.FORCE_CACHE).build();
            Log.i("ww", "no network");
        }
        Response response = chain.proceed(request);

        if (NetWorkUtils.isNetworkAvailable(GApp.getInstance())) {
            //   String cacheControl = request.cacheControl().toString();
            return response.newBuilder()
                    .header("Cache-Control", CACHE_CONTROL_NETWORK)
                    .removeHeader("Pragma")
                    .build();
        } else {
            return response.newBuilder()
                    .header("Cache-Control", "public, " + CACHE_CONTROL_CACHE)
                    .removeHeader("Pragma")
                    .build();
        }
    }
};

展开
收起
爱吃鱼的程序员 2020-06-22 23:05:20 605 0
1 条回答
写回答
取消 提交回答
  • https://developer.aliyun.com/profile/5yerqm5bn5yqg?spm=a2c6h.12873639.0.0.6eae304abcjaIB

    要么修改retrofit源码,要么自己去实现本地缓存

    2020-06-22 23:05:38
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
基于英特尔 SSD 的虚拟机缓存解决SSD 立即下载
用户态高速块缓存方案 立即下载
高性能Web架构之缓存体系 立即下载