RxJava(九)zip 操作符在 Android 中的实际使用场景

RxJava 系列文章目录导读:

一、RxJava create 操作符的用法和源码分析
二、RxJava map 操作符用法详解
三、RxJava flatMap 操作符用法详解
四、RxJava concatMap 操作符用法详解
五、RxJava onErrorResumeNext 操作符实现 app 与服务器间 token 机制
六、RxJava retryWhen 操作符实现错误重试机制
七、RxJava 使用 debounce 操作符优化 app 搜索功能
八、RxJava concat 操作处理多数据源
九、RxJava zip 操作符在 Android 中的实际使用场景
十、RxJava switchIfEmpty 操作符实现 Android 检查本地缓存逻辑判断
十一、RxJava defer 操作符实现代码支持链式调用
十二、combineLatest 操作符的高级使用
十三、RxJava 导致 Fragment Activity 内存泄漏问题
十四、interval、takeWhile 操作符实现获取验证码功能
十五、RxJava 线程的自由切换


一、zip 操作符概述

官方文档描述:

Returns an Observable that emits the results of a specified combiner function applied to combinations of two items emitted,
in sequence, by two other Observables.

流程图:

RxJava(九)zip 操作符在 Android 中的实际使用场景_第1张图片

简单来说 zip 操作符就是合并多个数据流,然后发送 (Emit) 最终合并的数据。

二、zip 操作符实际案例

需求描述:

在很多 App 种都会有图片上传的功能,比如商品的评价,
客户端允许用户拍照上传(可能多张),
把图片上传到又拍云(现在很多中小型公司都是用又拍云作为图片服务器),
然后获取图片的url,再把图片的信息(图片 URL,图片大小)发送给服务器。

主要逻辑:

1, 先把所有的图片上传到又拍云(比如3张图片)

2, 获取图片的 URL 路径,图片大小等

3, 最后把数据全部提交给服务器

实现代码:

//需要上传的图片
Picture[] ps = xxx;
Observable.zip(
      Observable.from(ps),
      getUpYunAddress(ps.length),//获取上传的url
      new Func2() {
          @Override
          public Picture call(Picture picture, UpYunAddress upYunAddress) {
              //如果该图片已经上传则不应该上传
              if (TextUtils.isEmpty(picture.getSource())) {
                  try {
                      //使用又拍云提供的工具类,上传图片
                      String path = UpYunUtil.uploadImage(upYunAddress, picture.getLocalUrl());
                      //获取最终的url
                      String finalUrl = upYunAddress.getPrefix() + path;
                      picture.setSource(finalUrl);
                  } catch (Exception e) {
                      e.printStackTrace();
                  }
              }
              return picture;
          }
      })
      .subscribeOn(Schedulers.io())
      .observeOn(AndroidSchedulers.mainThread())
      //上传成功后获取图片大小
      .flatMap(new Func1>() {
          @Override
          public Observable call(Picture picture) {
              if (TextUtils.isEmpty(picture.getHeight()) || TextUtils.isEmpty(picture.getWidth())) {
                  BitmapFactory.Options options;
                  if (!TextUtils.isEmpty(picture.getLocalUrl())) {
                      options = ImageUtil.getBitmapOptions(picture.getLocalUrl());
                      picture.setLocalUrl(null);
                  } else {
                      options = ImageUtil.getBitmapOptions(picture.getSource());
                  }
                  picture.setWidth(String.valueOf(options.outWidth));
                  picture.setHeight(String.valueOf(options.outHeight));
              }
              return Observable.just(picture);
          }
      });
      //最后处理最终的数据。

代码的注释非常详细,我就不再赘述了!

对于复杂的业务,使用 RxJava 来解决,感觉行云流水般,再也不用各种复杂的嵌套了。


如果你觉得本文帮助到你,给我个关注和赞呗!

另外,我为 Android 程序员编写了一份:超详细的 Android 程序员所需要的技术栈思维导图

如果有需要可以移步我的 GitHub -> AndroidAll,里面包含了最全的目录和对应知识点链接,帮你扫除 Android 知识点盲区。 由于篇幅原因只展示了 Android 思维导图:
超详细的Android技术栈

你可能感兴趣的:(RxJava,Android)