zoukankan      html  css  js  c++  java
  • 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();
        }
    }
    怎么调用就不讲了。代码是最好的老师

  • 相关阅读:
    《博客园美化》添加雪花/修改icon
    js获取开始年与结束年之间的年份
    《博客园美化》为您的博客增加一个萌萌的看板娘吧
    JS对比时间大小
    同域名下两个子级域名共享cookie
    input输入框禁止显示历史记录
    C# 操作符 << 与 >>
    如何在IIS上发布网站
    Sql 插入操作时返回当前新增的Id
    JS Cookie操作
  • 原文地址:https://www.cnblogs.com/shoneworn/p/9029434.html
Copyright © 2011-2022 走看看