1,设置拦截器
Interceptor interceptor = new Interceptor() { @Override public Response intercept(Chain chain) throws IOException { Request request = chain.request();//拦截Request对象 Log.d("OkHttpUtils", "request.url():" + request.url()); Response response = chain.proceed(request);//获取服务器响应 if (TextUtils.isEmpty(response.cacheControl().toString())){ int time = 0; //判断是否有网络 如果有网络就加载网络数据 没有网络就加载缓存数据 if (isNetworkAvailable()){ time = 0; }else { time = 60 * 60 * 24 * 365; } //生成新的response对象 往新的对象中手动添加Cache-Control 让其支持缓存 Response newReponse = response.newBuilder().addHeader("Cache-Control", "max-age="+time).build(); return newReponse; } return response; } };
2,
Cache cache = new Cache(App.context.getCacheDir(),1024*1024*10);//设置缓存内容的大小 OkHttpClient.Builder builder = new OkHttpClient.Builder(); builder.cache(cache);
//添加拦截器 builder.addInterceptor(interceptor); OkHttpClient client = builder.build(); retrofit = new Retrofit.Builder() .client(client) .baseUrl(Urls.SERVICE_URL) .addConverterFactory(GsonConverterFactory.create()) .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) .build();
3,当有网络时直接从网络上获取数据,若没有网络就读取缓存中的数据。从而节省用户的流量,增加用户体验
//判断是否有网络 public boolean isNetworkAvailable() { ConnectivityManager manager = (ConnectivityManager) App.context .getApplicationContext().getSystemService( Context.CONNECTIVITY_SERVICE); if (manager == null) { return false; } NetworkInfo networkinfo = manager.getActiveNetworkInfo(); if (networkinfo == null || !networkinfo.isAvailable()) { return false; } return true; }