为了优化网络环境和减轻服务器负担,很多网络请求都是可以使用缓存的。比如某个界面,每次刷新都会调用接口。这种操作,无形中给服务器增加了几倍的访问量。那么,有没有方法可以减少这类无效的访问呢?答案是肯定的。
给网络请求加上缓存。并设置缓存时间,当在这个时间段类,可以不用访问服务器,直接拿到上次访问得到的数据。这样,在有效期内,即便网络断开,只要还在缓存有效期内,也可以拿到服务端返回的数据。
/** * Created by admin on 2018/5/8. */ public class NetworkInterceptor implements Interceptor { @Override public Response intercept(Chain chain) throws IOException { //一、无论有无网路都添加缓存。 Request request = chain.request(); Response response = chain.proceed(request); int maxAge = 60; return response.newBuilder() .removeHeader("Pragma") .removeHeader("Cache-Control") .addHeader("name","shone") .header("Cache-Control", "public, max-age=" + maxAge) .build(); } }
将Interceptor加入到请求中
private void testOnlyRequest() throws Exception{ File cacheFile = new File(this.getApplication().getCacheDir(), "caheData"); //设置缓存大小 Cache cache = new Cache(cacheFile, 1024*1024*14);//google建议放到这里 //步骤一、创建okhttp3 client final OkHttpClient client = new OkHttpClient.Builder() .retryOnConnectionFailure(true) .connectTimeout(15,TimeUnit.SECONDS) .addNetworkInterceptor(new CacheInterceptor())//这里大家一定要注意了是addNetworkOnterceptor别搞错了啊。 .cache(cache) .build(); new Thread(new Runnable() { @Override public void run() { Retrofit retrofit= new Retrofit.Builder() .baseUrl("http://fy.iciba.com/") .client(client) .addConverterFactory(GsonConverterFactory.create()) .build(); GetRequest_Interface request = retrofit.create(GetRequest_Interface.class); Call<Translation1> call= request.getCall_1(); Translation1 translation1 = null; try { translation1 = call.execute().body(); translation1.show(); } catch (IOException e) { e.printStackTrace(); } } }).start(); }
看看效果:
log日志可以看出,我发起了三次网络请求。三次都得到了结果。
在看看我抓包日志。可以看出,我只进行了一次服务器请求。
通过示例,应该可以看出,添加了缓存,可以明显降低服务器请求次数。