返回一個(gè)Observable,它發(fā)射一個(gè)類似于函數(shù)聲明的值
http://wiki.jikexueyuan.com/project/rx-docs/images/operators/start.png" alt="Start" />
編程語言有很多種方法可以從運(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),過程類似,但是沒有返回值,在這種情況下,這個(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并開始發(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相似。