zoukankan      html  css  js  c++  java
  • Android Retrofit RxJava实现缓存

    RxJava如何与Retrofit结合参考:http://blog.csdn.net/jdsjlzx/article/details/52015347

    缓存配置

    app网络数据的离线缓存实现有很多种办法,例如存进数据库(保存json使用时拿出来解析),存专有文件,或SharedPreference等等,也可以自己实现 LruCache 和 DiskLruCache 这两种缓存策略构成二级缓存(内存和磁盘)

    缓存对于移动端是非常重要的存在:

    减少请求次数,减小服务器压力. 
    本地数据读取速度更快,让页面不会空白几百毫秒。 
    在无网络的情况下提供数据。 
    okhttp的缓存设计和浏览器的缓存设计差不多,可以通过添加响应头的形式进行缓存处理。

    retrofit是依赖okhttp的一套RESTful架构的Android(Java)客户端实现,通过构造retrofit时的 .client() 方法更改其中的okhttp的实现,从而达到缓存的效果,在这里不介绍retrofit的具体用法。

    下面是一个例子实现了有网缓存,无网络只读取缓存

    File cacheFile = new File(APP.getContext().getExternalCacheDir(),"ZhiBookCache");
        Cache cache = new Cache(cacheFile,1024*1024*50);
        Interceptor interceptor = new Interceptor() {
          @Override
          public Response intercept(Chain chain) throws IOException {
            Request request = chain.request();
            if (!HttpUtils.isNetworkConnected(APP.getContext())) {
              request = request.newBuilder()
                  .cacheControl(CacheControl.FORCE_CACHE)
                  .build();
            }
            Response response = chain.proceed(request);
            if (HttpUtils.isNetworkConnected(APP.getContext())) {
              int maxAge = 0 * 60;
              // 有网络时 设置缓存超时时间0个小时
              response.newBuilder()
                  .header("Cache-Control", "public, max-age=" + maxAge)
                  .removeHeader("Pragma")// 清除头信息,因为服务器如果不支持,会返回一些干扰信息,不清除下面无法生效
                  .build();
            } else {
              // 无网络时,设置超时为4周
              int maxStale = 60 * 60 * 24 * 28;
              response.newBuilder()
                  .header("Cache-Control", "public, only-if-cached, max-stale=" + maxStale)
                  .removeHeader("Pragma")
                  .build();
            }
            return response;
          }
        };
        client = new OkHttpClient.Builder().cache(cache)
            .addInterceptor(interceptor)
            .build();
        retrofit = new Retrofit.Builder()
            .baseUrl(RetrofitAPI.BASIC_DAILY)
            .addConverterFactory(GsonConverterFactory.create())
            .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
            .client(client)
            .build();
        retrofitAPI = retrofit.create(RetrofitAPI.class);

    之后调用下面代码获取请求后的序列化对象

    retrofitAPI.getDaily()
        .subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .subscribe(new Observer<DailyBean>() {
            @Override
            public void onCompleted() {}
            @Override
            public void onError(Throwable e) {
                Log.d(TAG,e.getMessage());
            }
            @Override
            public void onNext(DailyBean bean) {
                listener.onGetDailySuccess(bean);
            }
    });

    最后附上retrofit接口部分:

    @GET("news/latest")
    Observable<DailyBean> getDaily();
     
  • 相关阅读:
    HDU 5154 Harry and Magical Computer bfs
    opencv第一课 打开一个图片
    Codeforces Round #131 (Div. 1) A
    Topcoder SRM 643 Div1 250<peter_pan>
    bestcoder#23 1002 Sequence II 树状数组+DP
    bestcoder#23 1001 Sequence
    Oil Deposits 搜索 bfs 强联通
    迷宫问题 模拟队列 广度优先搜索
    Codeforces Round #283 (Div. 2) C. Removing Columns 暴力
    Codeforces Round #283 (Div. 2) B. Secret Combination 暴力水题
  • 原文地址:https://www.cnblogs.com/android-blogs/p/5741542.html
Copyright © 2011-2022 走看看