Retrofit2.0的离线缓存

本文介绍如何在Retrofit2.0中配置离线缓存功能,通过OkHttp拦截器实现缓存策略,有效减少网络请求次数,节省用户流量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Retrofit2.0的离线缓存

为何要使用离线缓存呢?因为我们的APP不能因为一些经常不去变动的数据,而去经常的访问网络,这样的话,我们顾客的流量可就真的花花花的在走,要是精明点的(你的APP就被Uninstall了)说完重要性,我们开始讲如何使用Retrofit2.0的离线缓存功能Retrofit2.0


Okhttp3.0的配置

大家在使用Retrofit2.0时候就应该已近知道了。Retrofit2.0是建立在Okhttps的基础上进行的,因此对于缓存的设置我们也是对Okhttps上进行设置;

public class Http_Retroif {
    private static final int DEFAULT_TIMEOUT = 5;
    private final Chat2Server chat2Server;

    private Http_Retroif() {
        File cacheFile = new File(MyApplication.getContext().getCacheDir(), "response");
        Cache cache = new Cache(cacheFile, 1024 * 1024 * 100); //100M
        OkHttpClient.Builder builder = new OkHttpClient.Builder();
        builder.connectTimeout(DEFAULT_TIMEOUT, TimeUnit.SECONDS)
                .addNetworkInterceptor(interceptor)
                .cache(cache);
        OkHttpClient build = builder.build();
        //Retrofit的声明(网络请求)
        Retrofit mbuild = new Retrofit.Builder()
                .baseUrl(Constant.HOSTNAME)
                .client(build)
                .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
                .addConverterFactory(GsonConverterFactory.create())
                .build();


        //数据的类型
        chat2Server = mbuild.create(Chat2Server.class);

    }

    public Chat2Server geterver() {
        return chat2Server;
    }

    //在访问HttpMethods时创建单例
    private static class SingletonHolder {
        private static final Http_Retroif INSTANCE = new Http_Retroif();
    }

    //获取单例
    public static Http_Retroif getInstance() {
        return SingletonHolder.INSTANCE;
    }

   private Interceptor interceptor = new Interceptor() { //离线器(有网无网 都优先从缓存中取数据)
        @Override
        public Response intercept(Chain chain) throws IOException {
            Request request = chain.request();
            Response response = chain.proceed(request);

            String cacheControl = request.cacheControl().toString();
            if (TextUtils.isEmpty(cacheControl)) {
                cacheControl = "public, max-age=43200";//响应头
            }
            return response.newBuilder()
                    .header("Cache-Control", cacheControl)
                    .removeHeader("Pragma")
                    .build();
        }
    };
}

我们来看一下接口的需要(@Headers是必要的)


    @Headers("Cache-Control:public,max-age=43200")
    @GET("servlet/ApiChat")
    Observable<Robot_Information> getRobotInformation(@Query("access_token") String access_token,
                                                      @Query("s") String s,
                                                      @Query("clientId") String clientId);


更多信息请看Retrofit2.0的官网详细信息

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值