android网络优化之添加缓存给服务器减负

引言:

        在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();
    }
}
怎么调用就不讲了。代码是最好的老师

posted @ 2018-05-10 11:23  shoneworn  阅读(1325)  评论(0编辑  收藏  举报