一、描述
任何时候,只要在另一个Observable发射的数据定义的时间窗口内,这个Observable发射了一条数据,就结合两个Observable发射的数据。
Join操作符结合两个Observable发射的数据,基于时间窗口(你定义的针对每条数据特定的原则)选择待集合的数据项。你将这些时间窗口实现为一些Observables,它们的生命周期从任何一条Observable发射的每一条数据开始。当这个定义时间窗口的Observable发射了一条数据或者完成时,与这条数据关联的窗口也会关闭。只要这条数据的窗口是打开的,它将继续结合其它Observable发射的任何数据项。你定义一个用于结合数据的函数。
join默认不在任何特定的调度器上执行。
二、示意图
三、示例代码
1 | Observable create1 = Observable.create(new Observable.OnSubscribe<Integer>() { |
四、运行结果
1 | onNext: 0-0 |
注意点:
join()方法有4个参数:
- Observable
right:目标Observable,也可以称为右Observable;与之相对应的是源Observable,也可以称为左Observable。 - rx.functions.Func1
> leftDurationSelector:左Observable发射的数据的有效期。 - rx.functions.Func1
> rightDurationSelector:右Observable发射的数据的有效期。 - rx.functions.Func2
resultSelector):左Observable和右Observable发射的数据的结合方法。
这个方法比较难理解的地方在于中间两个有效期参数,比如上面的例子,左Observable每隔0.6秒发射一个数字,从0-5;右Observable每隔1秒发射一个数字,从0-3;结合上面的例子和示意图,在每一个Observable发射数据的时候:
- 0.0s时:
源Observable
和目标Observable
都发射0,这时结合后的数据为:0-0; - 0.6s时:
源Observable
发射1,这时会去寻找目标Observable
有没有在有效期内的数据,发现目标Observable
的0在有效期内,所以结合后的数据为:1-0; - 1.0s时:
目标Observable
发射1,这时会去寻找源Observable
有没有在有效期内的数据,发现源Observable
的1在有效期内,所以结合后的数据为:1-1; - …
项目代码已上传到Github:https://github.com/SherlockShi/RxJavaBestPractise
五、更多
跟join相关的操作符还有:
- groupJoin
详情可查阅下面的参考资料。
六、参考资料
PS:欢迎关注 SherlockShi 个人博客