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

15 篇文章 42 订阅

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

简单来说 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<Picture, UpYunAddress, Picture>() {
          @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<Picture, Observable<Picture>>() {
          @Override
          public Observable<Picture> 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技术栈

  • 8
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 9
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Chiclaim

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值