RxJava zip操作符在Android中的实际使用场景
来源:互联网 发布:windows驱动程序包很多 编辑:程序博客网 时间:2024/05/13 01:37
(转载)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操作符实际案例
需求描述:
<code class="hljs has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: "Source Code Pro", monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;">在很多app种都会有图片上传的功能,比如商品的评价,客户端允许用户拍照上传(可能多张),把图片上传到又拍云(现在很多中小型公司都是用又拍云作为图片服务器),然后获取图片的url,再把图片的信息(图片url,图片大小)发送给图片。</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li></ul>
主要逻辑:
1,先把所有的图片上传到又拍云(比如3张图片)
2,获取图片的url路径,图片大小等
3,最后把数据全部提交给服务器
<code class="hljs avrasm has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: "Source Code Pro", monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"> //需要上传的图片 Picture[] ps = xxx<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span> Observable<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.zip</span>( Observable<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.from</span>(ps), getUpYunAddress(ps<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.length</span>),//获取上传的url new Func2<Picture, UpYunAddress, Picture>() { @Override public Picture <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">call</span>(Picture picture, UpYunAddress upYunAddress) { //如果该图片已经上传则不应该上传 if (TextUtils<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.isEmpty</span>(picture<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.getSource</span>())) { try { //使用又拍云提供的工具类,上传图片 String path = UpYunUtil<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.uploadImage</span>(upYunAddress, picture<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.getLocalUrl</span>())<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span> //获取最终的url String finalUrl = upYunAddress<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.getPrefix</span>() + path<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span> picture<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.setSource</span>(finalUrl)<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span> } catch (Exception e) { e<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.printStackTrace</span>()<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span> } } return picture<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span> } }) <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.subscribeOn</span>(Schedulers<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.io</span>()) <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.observeOn</span>(AndroidSchedulers<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.mainThread</span>()) //上传成功后获取图片大小 <span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.flatMap</span>(new Func1<Picture, Observable<Picture>>() { @Override public Observable<Picture> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">call</span>(Picture picture) { if (TextUtils<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.isEmpty</span>(picture<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.getHeight</span>()) || TextUtils<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.isEmpty</span>(picture<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.getWidth</span>())) { BitmapFactory<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.Options</span> options<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span> if (!TextUtils<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.isEmpty</span>(picture<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.getLocalUrl</span>())) { options = ImageUtil<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.getBitmapOptions</span>(picture<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.getLocalUrl</span>())<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span> picture<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.setLocalUrl</span>(null)<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span> } else { options = ImageUtil<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.getBitmapOptions</span>(picture<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.getSource</span>())<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span> } picture<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.setWidth</span>(String<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.valueOf</span>(options<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.outWidth</span>))<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span> picture<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.setHeight</span>(String<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.valueOf</span>(options<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.outHeight</span>))<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span> } return Observable<span class="hljs-preprocessor" style="color: rgb(68, 68, 68); box-sizing: border-box;">.just</span>(picture)<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span> } })<span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">;</span> //最后处理最终的数据。</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li><li style="box-sizing: border-box; padding: 0px 5px;">29</li><li style="box-sizing: border-box; padding: 0px 5px;">30</li><li style="box-sizing: border-box; padding: 0px 5px;">31</li><li style="box-sizing: border-box; padding: 0px 5px;">32</li><li style="box-sizing: border-box; padding: 0px 5px;">33</li><li style="box-sizing: border-box; padding: 0px 5px;">34</li><li style="box-sizing: border-box; padding: 0px 5px;">35</li><li style="box-sizing: border-box; padding: 0px 5px;">36</li><li style="box-sizing: border-box; padding: 0px 5px;">37</li><li style="box-sizing: border-box; padding: 0px 5px;">38</li><li style="box-sizing: border-box; padding: 0px 5px;">39</li><li style="box-sizing: border-box; padding: 0px 5px;">40</li><li style="box-sizing: border-box; padding: 0px 5px;">41</li><li style="box-sizing: border-box; padding: 0px 5px;">42</li><li style="box-sizing: border-box; padding: 0px 5px;">43</li><li style="box-sizing: border-box; padding: 0px 5px;">44</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li><li style="box-sizing: border-box; padding: 0px 5px;">29</li><li style="box-sizing: border-box; padding: 0px 5px;">30</li><li style="box-sizing: border-box; padding: 0px 5px;">31</li><li style="box-sizing: border-box; padding: 0px 5px;">32</li><li style="box-sizing: border-box; padding: 0px 5px;">33</li><li style="box-sizing: border-box; padding: 0px 5px;">34</li><li style="box-sizing: border-box; padding: 0px 5px;">35</li><li style="box-sizing: border-box; padding: 0px 5px;">36</li><li style="box-sizing: border-box; padding: 0px 5px;">37</li><li style="box-sizing: border-box; padding: 0px 5px;">38</li><li style="box-sizing: border-box; padding: 0px 5px;">39</li><li style="box-sizing: border-box; padding: 0px 5px;">40</li><li style="box-sizing: border-box; padding: 0px 5px;">41</li><li style="box-sizing: border-box; padding: 0px 5px;">42</li><li style="box-sizing: border-box; padding: 0px 5px;">43</li><li style="box-sizing: border-box; padding: 0px 5px;">44</li></ul>
代码的注释非常详细,我就不再赘述了!
对于复杂的业务,使用RxJava来解决,感觉行云流水般,再也不用各种复杂的嵌套了。 :D)
0 0
- RxJava zip操作符在Android中的实际使用场景
- RxJava zip操作符在Android中的实际使用场景
- RxJava zip操作符在Android中的实际使用场景
- RxJava(九)zip操作符在Android中的实际使用场景
- Rxjava中的zip操作
- RxJava在Android中使用场景详解
- Rxjava操作符zip
- Android RxJava使用场景小结
- retrofit2 RxJava在android中的使用
- 设计模式-单例模式(Singleton)在Android中的应用场景和实际使用遇到的问题
- [置顶] 设计模式-单例模式(Singleton)在Android中的应用场景和实际使用遇到的问题
- 设计模式-单例模式(Singleton)在Android中的应用场景和实际使用遇到的问题
- angular4 路由实际使用中的应用场景
- RxJava在Android的应用场景
- RxJava适合在哪些场景使用呢?
- Android RxJava使用介绍(二) RxJava的操作符
- Android RxJava使用介绍(三) RxJava的操作符
- Android RxJava使用介绍(四) RxJava的操作符
- Springmvc 与 MyBatis的整合(四)service
- 集成TerichDB的SSDB性能测试
- 桌子上有一个盘子,每次只能放一个水果.爸爸专门向盘子里放苹果,妈妈专门向盘子里放橘子,一个儿子专门等吃盘子中的橘子,一个女儿专门等吃盘子中的苹果.用信号量实现他们间的同步机制.
- 超越之MongDB系列教程(一) MongDB的特点
- 集成 TerichDB 的 MongoDB 性能测试
- RxJava zip操作符在Android中的实际使用场景
- Eclipse中web项目部署至Tomcat步骤
- 信与信封问题
- Linux安装php环境
- CBF中for循环变矩阵乘法的思想(arrayfire)--复数矩阵
- css设置元素如何在div边框中上下垂直居中
- MySQL死锁解决原则
- 不知道名字的某题_20160622_1
- 乐于分享是一种境界的突破