这一节解释 BlockingObservable 的子类. 一个阻塞的Observable 继承普通的Observable类,增加了一些可用于阻塞Observable发射的数据的操作符。
BlockingObservable
要将普通的Observable 转换为 BlockingObservable,可以使用 [Observable.toBlocking( )](http://reactivex.io/RxJava/javadoc/rx/Observable.html#toBlocking()) 方法或者BlockingObservable.from( ) 方法。
Observable
Observable.toBlocking( )
BlockingObservable.from( )
forEach( )
first( )
firstOrDefault( )
last( )
lastOrDefault( )
mostRecent( )
next( )
latest( )
single( )
singleOrDefault( )
toFuture( )
toIterable( )
getIterator( )
伴随这个解释还有一个修改版的弹珠图,表示阻塞Observable的弹珠图:
BlockingObservable的方法不是将一个Observable变换为另一个,也不是过滤Observables,它们会打断Observable的调用链,会阻塞等待直到Observable发射了想要的数据,然后返回这个数据(而不是一个Observable)。
要将一个Observable转换为一个BlockingObservable,你可以使用Observable.toBlocking或BlockingObservable.from方法。
Observable.toBlocking
BlockingObservable.from
要获取BlockingObservable的发射物,使用无参数的first方法。
first
你也可以给first方法传递一个谓词函数用于获取满足条件的BlockingObservable。
和过滤操作符一样,如果原始Observable没有数据,first会抛出异常NoSuchElementException,firstOrDefault会返回一个默认值。
NoSuchElementException
firstOrDefault
firstOrDefault同样也接受一个谓词函数作为参数,用于获取满足条件的第一项,如果没有满足条件的就返回默认值。
single和first类似,但是如果不是正好发射一个数据,会抛出异常NoSuchElementException。其它几个变体的功能也是类似的。
single
同上,接受一个谓词函数,如果满足条件的不是正好一个,会抛出异常。
类似firstOrDefault,在为空时返回默认值,超过一个就抛出异常。
类似firstOrDefault,接受一个谓词函数,如果没有复合条件的,返回默认值;如果有多个复合条件的,以错误通知终止。
next操作符会阻塞直到BlockingObservable返回另外一个值,然后它返回那个值。你可以重复调用这个方法从BlockingObservable获取后续的数据项。以阻塞的方式高效的迭代获取它的发射物。
next
latest操作符也是类似的,但是它不会阻塞等待下一个值,它立即返回最近发射的数据项,只在Observable还没有发射任何数据时会阻塞。
latest
mostRecent操作符让你可以用类似的方式迭代一个BlockingObservable,但是它总是立即返回一个值,或者是默认值(如果BlockingObservable还没有发射任何数据),或者是BlockingObservable最近发射的数据项。
mostRecent
BlockingObservable类中也有一个类似的叫作forEach的方法。要使用这个方法,你首先需要使用BlockingObservable.from方法或Observable.toBlocking操作符将原始Observable转换为一个BlockingObservable。
forEach
BlockingObservable.forEach接受单个函数作为参数,这个函数的作用类似于普通Observable订阅中的onNext函数。forEach自身会阻塞知道BlockingObservable完成,当它不阻塞时就是完成了,不是通过调用一个回调方法表示它完成了。如果遇到了错误它将抛出一个RuntimeException(而不是调用一个类似于onError的回调方法)。
BlockingObservable.forEach
onNext
RuntimeException
onError
toBlocking()
BlockingObservable.from()
Observable.first
firstAsync
BlockingObservable.first
Observable.firstOrDefault
firstOrDefaultAsync
BlockingObservable.firstOrDefault
Observable.last
lastAsync
BlockingObservable.last
last
Observable.lastOrDefault
lastOrDefaultAsync
BlockingObservable.lastOrDefault
lastOrDefault
Observable.single
singleAsync
BlockingObservable.single
Observable.singleOrDefault
singleOrDefaultAsync
BlockingObservable.singleOrDefault
singleOrDefault
Copyright© 2013-2020
All Rights Reserved 京ICP备2023019179号-8