欢迎转载,转载请标明出处:

http://blog.csdn.net/johnny901114/article/details/51614927

本文出自:【余志强的博客】

一、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.

流程图:

简单来说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来解决,感觉行云流水般,再也不用各种复杂的嵌套了。 :D)


github源码下载

RxJava(九)zip操作符在Android中的实际使用场景的更多相关文章

  1. android 中IntentService的使用场景

    IntentService是继承并处理异步请求的一个类,在IntentService内有一个工作线程来处理耗时操作,启动IntentService的方式和启动传统的Service一样,同时,当任务执行 ...

  2. 系统剖析Android中的内存泄漏

    [转发]作为Android开发人员,我们或多或少都听说过内存泄漏.那么何为内存泄漏,Android中的内存泄漏又是什么样子的呢,本文将简单概括的进行一些总结. 关于内存泄露的定义,我可以理解成这样 没 ...

  3. Android中直播视频技术探究之---摄像头Camera视频源数据采集解析

    一.前言 在视频直播中一般都是两种视频数据源,一个是摄像头数据,一个是录制桌面数据,而一般来说美女妹子直播都是来自于摄像头数据,游戏直播都是录制桌面数据的,那么今天就来看看第一个数据源数据采集分析,A ...

  4. Android中开发需要的高效助推的命令总结

    ​Android 开发中我们有时候需要借助一些命令帮助更好的高效率定位解决问题,本文就来介绍一些可能有些隐藏的而却非常好用的命令,可以帮我们快速找到问题,这些命令都是本人在开发中实践总结,个人觉得非常 ...

  5. Android中使用反应式编程RxJava

    GitHut 地址: https://github.com/ReactiveX/RxAndroid (1)RxJava简介: RxJava 是一个在Java虚拟机上实现的响应式扩展库:提供了基于obs ...

  6. RxJava在Android中使用场景详解

    RxJava 系列文章 <一,RxJava create操作符的用法和源码分析> <二,RxJava map操作符用法详解> <三,RxJava flatMap操作符用法 ...

  7. Android开发学习之路-Android中使用RxJava

    RxJava的核心内容很简单,就是进行异步操作.类似于Handler和AsyncTask的功能,但是在代码结构上不同. RxJava使用了观察者模式和建造者模式中的链式调用(类似于C#的LINQ). ...

  8. Android笔记(二十九) Android中的异步更新(一) Android中的线程

    Java中的线程 1. 线程的两种实现方式 ①继承Thread类 ②实现Runnable接口 两者区别在于,Thread这个类的对象,代表的是一个线程,而Runnable的对象,代表的是线程体(也就是 ...

  9. RxJava学习笔记(操作符)

    前言 上一篇文章介绍了RxJava的基础知识和简单实现,篇幅已经比较多了,所以把操作符(Operators)相关的内容放在这一篇.有了上一篇文章的基础,相信会比较容易理解操作符相关的内容了. 操作符( ...

随机推荐

  1. Java数据类型与SQL数据类型的映射

    Java数据类型与SQL数据类型的映射 SQL Data Type Java Data Type char/varchar/longvarchar String numeric/decimal jav ...

  2. [Codeforces 606C]Sorting Railway Cars

    Description An infinitely long railway has a train consisting of n cars, numbered from 1 to n (the n ...

  3. [NOI2016]循环之美

    Description 牛牛是一个热爱算法设计的高中生.在他设计的算法中,常常会使用带小数的数进行计算.牛牛认为,如果在 k  进制下,一个数的小数部分是纯循环的,那么它就是美的.现在,牛牛想知道:对 ...

  4. 【BZOJ3685】【zkw权值线段树】普通van Emde Boas树

    原题传送门 因为马上要开始搞树套树了,所以学了一波权值线段树...毕竟是会点zkw线段树的,所以zkw线段树大法好! 解题思路: 介绍一下权值线段树吧,其实感觉就是线段树的本义,就是你用线段树维护了数 ...

  5. hdu 5137(2014广州—最短路)

    题意:给你一个图,求删除一个点后使1->n的距离最大 思路: 枚举删除点,然后求最短路,取这些最短路的最大值 #include <iostream> #include <cst ...

  6. 【UOJ UNR #1】争夺圣杯

    来自FallDream的博客,未经允许,请勿转载,谢谢. 传送门 考虑直接对每个数字,统计它会产生的贡献. 单调栈求出每个数字左边第一个大等于他的数,右边第一个大于他的 (注意只能有一边取等) 假设左 ...

  7. [BZOJ]1027 合金(JSOI2007)

    不知道该如何评价吧,很神的一道题,就算是10年前的题目也不可小觑啊. Description 某公司加工一种由铁.铝.锡组成的合金.他们的工作很简单.首先进口一些铁铝锡合金原材料,不同种类的原材料中铁 ...

  8. jQuery Datetable

    先来个官网可以直接看官网  https://www.datatables.net/manual/data/ 安装 DataTables是一个功能强大的Javascript库,用于为HTML表格添加交互 ...

  9. C语言程序设计 第一次作业

    (一)实验总结 1.求圆面积和周长 (1)题目 输入圆的半径,计算圆的周长和面积. (2)流程图 (3)测试数据及运行结果 (4)实验分析问题一:输出时往输出框输不上.原因 :没有加双引号.2.判断闰 ...

  10. Golang学习笔记:goroutine

    1.goroutine goroutine是go语言的并发体.在go语言里面能使用go关键字来实现并发. go func() 1.1 概念介绍 goroutine本质上是协程,我刚刚学习的时候就粗略地 ...