返回一個(gè)Observable,它發(fā)射一個(gè)類似于函數(shù)聲明的值
http://wiki.jikexueyuan.com/project/rx-docs/images/operators/start.png" alt="Start" />
編程語(yǔ)言有很多種方法可以從運(yùn)算結(jié)果中獲取值,它們的名字一般叫functions, futures, actions, callables, runnables
等等。在Start
目錄下的這組操作符可以讓它們表現(xiàn)得像Observable,因此它們可以在Observables調(diào)用鏈中與其它Observable搭配使用。
Start
操作符的多種RxJava實(shí)現(xiàn)都屬于可選的rxjava-async
模塊。
rxjava-async
模塊包含start
操作符,它接受一個(gè)函數(shù)作為參數(shù),調(diào)用這個(gè)函數(shù)獲取一個(gè)值,然后返回一個(gè)會(huì)發(fā)射這個(gè)值給后續(xù)觀察者的Observable。
注意:這個(gè)函數(shù)只會(huì)被執(zhí)行一次,即使多個(gè)觀察者訂閱這個(gè)返回的Observable。
http://wiki.jikexueyuan.com/project/rx-docs/images/operators/toAsync.png" alt="toAsync" />
rxjava-async
模塊還包含這幾個(gè)操作符:toAsync
, asyncAction
, 和asyncFunc
。它們接受一個(gè)函數(shù)或一個(gè)Action作為參數(shù)。
對(duì)于函數(shù)(functions),這個(gè)操作符調(diào)用這個(gè)函數(shù)獲取一個(gè)值,然后返回一個(gè)會(huì)發(fā)射這個(gè)值給后續(xù)觀察者的Observable(和start
一樣)。對(duì)于動(dòng)作(Action),過(guò)程類似,但是沒(méi)有返回值,在這種情況下,這個(gè)操作符在終止前會(huì)發(fā)射一個(gè)null
值。
注意:這個(gè)函數(shù)或動(dòng)作只會(huì)被執(zhí)行一次,即使多個(gè)觀察者訂閱這個(gè)返回的Observable。
http://wiki.jikexueyuan.com/project/rx-docs/images/operators/startFuture.png" alt="startFuture" />
rxjava-async
模塊還包含一個(gè)startFuture
操作符,傳遞給它一個(gè)返回Future
的函數(shù),startFuture
會(huì)立即調(diào)用這個(gè)函數(shù)獲取Future
對(duì)象,然后調(diào)用Future
的get()
方法嘗試獲取它的值。它返回一個(gè)發(fā)射這個(gè)值給后續(xù)觀察者的Observable。
http://wiki.jikexueyuan.com/project/rx-docs/images/operators/deferFuture.png" alt="deferFuture" />
rxjava-async
模塊還包含一個(gè)deferFuture
操作符,傳遞給它一個(gè)返回Future
的函數(shù)(這個(gè)Future
返回一個(gè)Observable
),deferFuture
返回一個(gè)Observable,但是不會(huì)調(diào)用你提供的函數(shù),直到有觀察者訂閱它返回的Observable。這時(shí),它立即調(diào)用Future
的get()
方法,然后鏡像發(fā)射get()
方法返回的Observable發(fā)射的數(shù)據(jù)。
用這種方法,你可以在Observables調(diào)用鏈中包含一個(gè)返回Observable的Future
對(duì)象。
http://wiki.jikexueyuan.com/project/rx-docs/images/operators/fromCallable.png" alt="fromAction" />
rxjava-async
模塊還包含一個(gè)fromAction
操作符,它接受一個(gè)Action
作為參數(shù),返回一個(gè)Observable,一旦Action終止,它發(fā)射這個(gè)你傳遞給fromAction
的數(shù)據(jù)。
http://wiki.jikexueyuan.com/project/rx-docs/images/operators/fromCallable.png" alt="fromCallable" />
rxjava-async
模塊還包含一個(gè)fromCallable
操作符,它接受一個(gè)Callable
作為參數(shù),返回一個(gè)發(fā)射這個(gè)Callable
的結(jié)果的Observable。
http://wiki.jikexueyuan.com/project/rx-docs/images/operators/fromRunnable.png" alt="fromRunnable" />
rxjava-async
模塊還包含一個(gè)fromRunnable
操作符,它接受一個(gè)Runnable
作為參數(shù),返回一個(gè)Observable,一旦Runnable終止,它發(fā)射這個(gè)你傳遞給fromRunnable
的數(shù)據(jù)。
http://wiki.jikexueyuan.com/project/rx-docs/images/operators/forEachFuture.png" alt="forEachFuture" />
rxjava-async
模塊還包含一個(gè)forEachFuture
操作符。它其實(shí)不算Start
操作符的一個(gè)變體,而是有一些自己的特點(diǎn)。你傳遞一些典型的觀察者方法(如onNext, onError和onCompleted)給它,Observable會(huì)以通常的方式調(diào)用它。但是forEachFuture
自己返回一個(gè)Future
并且在get()
方法處阻塞,直到原始Observable執(zhí)行完成,然后它返回,完成還是錯(cuò)誤依賴于原始Observable是完成還是錯(cuò)誤。
如果你想要一個(gè)函數(shù)阻塞直到Observable執(zhí)行完成,可以使用這個(gè)操作符。
rxjava-async
模塊還包含一個(gè)runAsync
操作符。它很特殊,返回一個(gè)叫做StoppableObservable
的特殊Observable。
傳遞一個(gè)Action
和一個(gè)Scheduler
給runAsync
,它返回一個(gè)使用這個(gè)Action
產(chǎn)生數(shù)據(jù)的StoppableObservable
。這個(gè)Action
接受一個(gè)Observable
和一個(gè)Subscription
作為參數(shù),它使用Subscription
檢查unsubscribed
條件,一旦發(fā)現(xiàn)條件為真就立即停止發(fā)射數(shù)據(jù)。在任何時(shí)候你都可以使用unsubscribe
方法手動(dòng)停止一個(gè)StoppableObservable
(這會(huì)同時(shí)取消訂閱與這個(gè)StoppableObservable
關(guān)聯(lián)的Subscription
)。
由于runAsync
會(huì)立即調(diào)用Action
并開(kāi)始發(fā)射數(shù)據(jù),在你創(chuàng)建StoppableObservable之后到你的觀察者準(zhǔn)備好接受數(shù)據(jù)之前這段時(shí)間里,可能會(huì)有一部分?jǐn)?shù)據(jù)會(huì)丟失。如果這不符合你的要求,可以使用runAsync
的一個(gè)變體,它也接受一個(gè)Subject
參數(shù),傳遞一個(gè)ReplaySubject
給它,你可以獲取其它丟失的數(shù)據(jù)了。
在RxJava中還有一個(gè)版本的From
操作符可以將Future轉(zhuǎn)換為Observable,與start
相似。