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