单事件源(Single)

RxJava(及其衍生品,如RxGroovy和RxScala)提供了一个事件源的变体“单事件源”。

单事件源和事件大部分是类似的,但它总是只输出一个事件或错误通知,而不是像事件源那样发出一系列的事件或通知。 因此,订阅的时候不是使用原先的(onNextonErroronCompleted)这三个方法, 而是以下两个方式:

onSuccess
单事件源调用此方法当发出唯一的事件
onError
当单事件无法发出事件时通过此方法处理Throwable对象

单事件源将只调用其中一种方法,并且只调用一次。在调用任一方法时,单事件源终止并且对它的订阅结束。

单事件源操作符组合

如同事件源,单事件源也可以通过各种操作符进行操作。 一些操作符甚至允许混合事件源和单事件源两种类型:

操作符返回描述
compose单事件源创建自定义操作符
concatconcatWith事件源将多个单事件源发出的事件连接起来做事件源
create单事件源通过显式调用观察者方法创建单事件源
delay单事件源延迟指定时间发出事件
doOnError单事件源返回一个单事件源会在调用onError时调用指定的方法
doOnSuccess单事件源返回一个单事件源会在调用onSuccess时调用指定的方法
error单事件源返回一个单事件源立即通知观察者错误
flatMap单事件源返回一个发出函数处理后事件的结果的单事件源
flatMapObservable事件源返回一个发出函数处理后事件的结果的单事件源
from单事件源转换一个可能还没有完成的异步任务为一个单事件源
just单事件源返回一个发出指定事件的单事件源
map单事件源返回一个单事件源,将发出的事件通过将函数处理后在发出
merge单事件源一个单事件源发出另一个单事件源,将发出后一个事件源的事件
mergemergeWith事件源合并两个或多个单事件源为一个事件源
observeOn单事件源让单事件源的在指定的调度器上调用订阅方法
onErrorReturn单事件源将发出错误通知的单事件源转换为发出指定事件的单事件源
subscribeOn单事件源指定单事件源的调度器
timeout单事件源如果源单事件源未在指定时间段内发出事件,则返回一个发出错误通知的单事件源
toSingle单事件源将发出单个事件的事件源转换为发出该事件的单事件源
toObservable事件源将单事件源转换为事件源,它发出单事件源发出的事件,然后完成
zipzipWith单事件源返回一个单事件源发出通过指定的函数将两个或多个其他单事件源发出的事件组合的结果

本页的下面部分将提供弹珠图来说明这些操作符。 下图是单事件源在弹珠图中的表示:

compose

concat和concatWith

这也是操作符的一个实例版本:

create

delay

这也是操作符的一个实例版本以指定的调度器执行延迟:

doOnError

doOnSuccess

error

flatMap

flatMapObservable

from

还有一种以调度器为参数:

just

map

merge和mergeWith

其中一种merge的实现是,一个单事件源发出另一个单事件源,则发出后一个事件源的事件:

另一种是合并两个或多个单事件源为一个事件源,该事件源发出源单事件源发出的事件(以随机顺序):

observeOn

onErrorReturn

subscribeOn

timeout

如果在订阅后指定的时间段内没有发出事件,超时将发出单个中止错误通知。一种实现是通过指定的时间单位设置此时间:

也可以为要运行的计时器指定调度器:

另一种实现是超时切换到备用事件源而不是在超时时发出错误通知:

同样有个能指定调度器的版本:

toObservable

zip和zipWith