返回一個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
相似。