引言:
在app的很多实用过程中,经常会出现频繁的刷新操作,这个刷新不是指去更新ui,而是类似打开界面—关闭界面—再打开—再关闭等。这段过程中,并没有实质的数据变化,但是这个操作过程中,却会频繁的调用接口,初始化数据,然后去刷新UI,当然还有很多其他场景。这类频繁的无效的数据访问,无疑会增加网络请求的次数,给服务器带来压力,在弱网环境下,也会带来卡顿等不好的体验。
需求分析:
有没有一种方法,能够缓存首次成功的数据访问,然后定个有效期,在这个有效期内,如果还有同一网络请求,则直接从缓存中获取返回值。这样,可以在这个有效期内,减小访问服务器的次数。当用户量大的情况下,可以给服务器明显减负。
解决方案:
经过查找,还真找到一个有效的方案来解决上述问题。
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") .header("Cache-Control", "public, max-age=" + maxAge) .build(); } }
使用方法:
private void testOnlyRequest() throws Exception{ File cacheFile = new File(this.getApplication().getCacheDir(), "caheData"); //设置缓存大小 Cache cache = new Cache(cacheFile, 1024*1024*14); final OkHttpClient client = new OkHttpClient.Builder() .retryOnConnectionFailure(true) .connectTimeout(15,TimeUnit.SECONDS) .addNetworkInterceptor(new NetworkInterceptor()) .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(); }
补全下代码:
public interface GetRequest_Interface { // 网络请求1 @GET("ajax.php?a=fy&f=en&t=zh&w=welcome") Call<Translation1> getCall_1(); }
public class Translation1 { private int status; private content content; private static class content { private String ph_en; private String ph_am; private String ph_en_mp3; private String ph_am_mp3; private String ph_tts_mp3; private String[] word_mean; } //定义 输出返回数据 的方法 public void show() { Log.d("RxJava", "翻译内容 = " + content.word_mean[0]); } public void show(Context context){ Toast.makeText(context,"翻译内容 = " + content.word_mean[0], Toast.LENGTH_SHORT).show(); } }怎么调用就不讲了。代码是最好的老师