前言
前几天和Stay(有心课堂创始人)讨论了一个rxjava场景,觉得很有意思,这里也和大家分享下。通过还原一个真实的开发过程,来感受下rxjava的便利之处。
不认识Stay的可以看看他的博客吧:http://www.jianshu.com/users/...
巨坑从来都是由小坑慢慢塌陷的
先来看下一段最普通的代码
在没有特殊需求的情况下,代码就这么简单。你可以理解为,获取一个目录下的所有文件,将它们一个个传到服务器上去。
看起来好像是没什么问题,一个for循环搞定。一个task失败了不影响另一个task。每个task run在一个单独的子线程。
之前rxjava使用场景只局限于和Retrofit一起用。没过多的使用操作符。因此在uploadFile(path)
方法中就是最简单的Retrofit+Rxjava上传文件。rxjava就切换了下线程。
对于写惯java的人,这么写是没什么问题的。但如果深入使用过rxjava之后,这么写就非常别扭了。看到for loop了,你不想将它改成Observable.from()
嘛?
把能看见的都改成stream吧
getFileList()方法是获取sd卡中data包下所有以loc为后缀的files。
workflow分三步:
locate to data dir
list files under data dir
filter files with .loc suffix
换成rxjava非常容易
先发射一个data目录路径
-
需求是多次上传文件,得用flatMap将data映射成一个Observable<File[]>
2.1 当然你可以选择直接listFile(filter),但这样回调又套回调,不是很好看。 2.2 用filter操作符将发射来的File[]过滤
比如像2.1这样写
或者像2.2这样写
注意,在flatMap中又用from()操作符将File[]变换成一个个Observable<File>发射。
假如你的API接口可以接收多个文件,其实也不用这样写。直接在flatMap中拼接RequestBody,调用API请求就可以了。比如像下图这样写:
 `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。