RxJava(及其衍生品,如RxGroovy和RxScala)提供了一个事件源的变体“单事件源”。
单事件源和事件大部分是类似的,但它总是只输出一个事件或错误通知,而不是像事件源那样发出一系列的事件或通知。 因此,订阅的时候不是使用原先的(onNext、onError和onCompleted)这三个方法, 而是以下两个方式:
单事件源将只调用其中一种方法,并且只调用一次。在调用任一方法时,单事件源终止并且对它的订阅结束。
如同事件源,单事件源也可以通过各种操作符进行操作。 一些操作符甚至允许混合事件源和单事件源两种类型:
操作符 | 返回 | 描述 |
---|---|---|
compose | 单事件源 | 创建自定义操作符 |
concat和concatWith | 事件源 | 将多个单事件源发出的事件连接起来做事件源 |
create | 单事件源 | 通过显式调用观察者方法创建单事件源 |
delay | 单事件源 | 延迟指定时间发出事件 |
doOnError | 单事件源 | 返回一个单事件源会在调用onError时调用指定的方法 |
doOnSuccess | 单事件源 | 返回一个单事件源会在调用onSuccess时调用指定的方法 |
error | 单事件源 | 返回一个单事件源立即通知观察者错误 |
flatMap | 单事件源 | 返回一个发出函数处理后事件的结果的单事件源 |
flatMapObservable | 事件源 | 返回一个发出函数处理后事件的结果的单事件源 |
from | 单事件源 | 转换一个可能还没有完成的异步任务为一个单事件源 |
just | 单事件源 | 返回一个发出指定事件的单事件源 |
map | 单事件源 | 返回一个单事件源,将发出的事件通过将函数处理后在发出 |
merge | 单事件源 | 一个单事件源发出另一个单事件源,将发出后一个事件源的事件 |
merge和mergeWith | 事件源 | 合并两个或多个单事件源为一个事件源 |
observeOn | 单事件源 | 让单事件源的在指定的调度器上调用订阅方法 |
onErrorReturn | 单事件源 | 将发出错误通知的单事件源转换为发出指定事件的单事件源 |
subscribeOn | 单事件源 | 指定单事件源的调度器 |
timeout | 单事件源 | 如果源单事件源未在指定时间段内发出事件,则返回一个发出错误通知的单事件源 |
toSingle | 单事件源 | 将发出单个事件的事件源转换为发出该事件的单事件源 |
toObservable | 事件源 | 将单事件源转换为事件源,它发出单事件源发出的事件,然后完成 |
zip和zipWith | 单事件源 | 返回一个单事件源发出通过指定的函数将两个或多个其他单事件源发出的事件组合的结果 |
本页的下面部分将提供弹珠图来说明这些操作符。 下图是单事件源在弹珠图中的表示:
这也是操作符的一个实例版本:
这也是操作符的一个实例版本以指定的调度器执行延迟:
还有一种以调度器为参数:
其中一种merge的实现是,一个单事件源发出另一个单事件源,则发出后一个事件源的事件:
另一种是合并两个或多个单事件源为一个事件源,该事件源发出源单事件源发出的事件(以随机顺序):
如果在订阅后指定的时间段内没有发出事件,超时将发出单个中止错误通知。一种实现是通过指定的时间单位设置此时间:
也可以为要运行的计时器指定调度器:
另一种实现是超时切换到备用事件源而不是在超时时发出错误通知:
同样有个能指定调度器的版本: