格式說明:
-
- Operator : 表示其是一個Operator操作。
- Func():表示其是一個函數。
- ReactiveX官網: http://reactivex.io/, 建議閱讀其Docs,闡述了一些ReactiveX的基本理念和概念:
- 對Observable的解釋和定位: http://reactivex.io/documentation/observable.html
- 對Operator的羅列,任何時候,當你覺得有些需求用已知的Operator不能優雅解決時,可以看看這個:http://reactivex.io/documentation/operators.html
- Single是一種Observable的特殊變種,其只提供了onSuccess和onError兩種消息,並且只會發一次,適用於某些特殊的場景(Eg, one-shot):http://reactivex.io/documentation/single.html
- Subject像是一種橋接器,既是Observer又是Observable: http://reactivex.io/documentation/subject.html
- Scheduler是RxJava線程優雅的一個體現:http://reactivex.io/documentation/scheduler.html
- 一個不錯的RxJava Operator的交互示意圖: http://rxmarbles.com/, 注意,其上面的Operator種類並不完整。
- Operator並不神祕,其本質是裝飾模式。
- 對Operator的使用,遵循單一職責原則,在相應的Operator中只做該Operator語義允許的操作,比如,在Map中,你只應該做類型轉化相關的操作,而不應該做和其無關的操作(side-effect-operation)。
- 如果你發現onNext()中的邏輯還是很複雜,那麼很大可能說明是你沒有充分利用Operator, 一般來說,onNext()中返回的數據應該是最終並直接可用的數據。
- 對於不是非常熟悉的RxJava的API,建議先細緻閱讀其API註釋,不要遺漏任何信息,RxJava的很多函數註釋在描述中不會提示,但是在下面的參數/throw說明中會提示一些關鍵點,因此不要遺漏。
- 參考http://gitlab.renrenche.com/android/carapp/issues/1055,對subscribe(final Action1<?
super T> onNext)要慎重使用,該函數會在Observable調用onError()時強制拋出OnErrorNotImplementedException(參見其底部註釋),從源碼上可以看出其如果只提供了onNext的處理,那麼onError的處理會被設置爲InternalObservableUtils.ERROR_NOT_IMPLEMENTED(ErrorNotImplementedAction的實例),該函數在執行call時會直接拋出OnErrorNotImplementedException(t)異常。考慮到現在我們整體對RxJava的運用還停留在初級,因此建議對任何的subscribe(...)都使用subscribe(new
Subscriber())這種保險的方式來進行。
- 應用場景: 在onError()和onNext()中需要做同樣的善後工作。
- 適用doOnTerminate,不管消息流最終以onError()/onComplete()結束,都會被調用(類似Java的finally),對於某些需要onError()/onComplete()後都要執行的操作(如網絡加載成功/失敗都要隱藏載入中界面),可以放在這裏。
- 適用doOnTerminate,不管消息流最終以onError()/onComplete()結束,都會被調用(類似Java的finally),對於某些需要onError()/onComplete()後都要執行的操作(如網絡加載成功/失敗都要隱藏載入中界面),可以放在這裏。
- 應用場景: 在subscribe時需要做一些初始化操作(比如開始加載數據時顯示載入中界面)。
- 適用doOnSubscribe,會在Observable被Subscribe時被調用,適合在裏面做一些初始化操作(比如開始加載數據時顯示載入中界面)。
- 適用doOnSubscribe,會在Observable被Subscribe時被調用,適合在裏面做一些初始化操作(比如開始加載數據時顯示載入中界面)。
- doOnUnsubscribe在Observable被unsubscribe()時被調用,可以利用其做一些資源清理工作。
- 應用場景: 有時根本不需要關心Observable的onXXX回調,而只是想通過subscribe的方式將Observable運轉起來。
- 適用subscribe(), 不過注意: onError()被觸發會導致拋出OnErrorNotImplementedException。
- 適用subscribe(), 不過注意: onError()被觸發會導致拋出OnErrorNotImplementedException。
- 應用場景: 有時候不得不提供一個Action接口對象做佔位,又懶的實現時。
- 適用Actions.empty()。
- 適用Actions.empty()。
- 你遲早需要自己來實現OnSubscribe<T>, 那麼OnSubscribeFromArray<T>是個不錯的簡單參考。
- 應用場景: 你先需要獲得並處理一個Collection(Map/List...), 然後遍歷對每個成員進行處理和歸總。
- 適用FlatMap,它能將信息流的負載從Collection變爲Collection中的成員。
- 適用FlatMap,它能將信息流的負載從Collection變爲Collection中的成員。
- RxBindinghttps://github.com/JakeWharton/RxBinding 是一個對Android的View級Reactive適配庫,把原來的Listener模式適配爲RxJava的消息流模式,
其實現機理很簡單,源碼可以一看。
- 應用場景: 需要對onNext/onError/onComplete做歸一化的處理。
- 適用materialize,會將onNext()/onError/onComplete統一封裝爲Notification類型的消息,將Observable轉化爲一個只傳遞Notification類型消息的Observable(注意,該Observable最後會觸發onComplete(), 但是和被轉化的Observable的onComplete()沒有任何關係,前者已經被轉化爲了Notification)。
- 適用materialize,會將onNext()/onError/onComplete統一封裝爲Notification類型的消息,將Observable轉化爲一個只傳遞Notification類型消息的Observable(注意,該Observable最後會觸發onComplete(), 但是和被轉化的Observable的onComplete()沒有任何關係,前者已經被轉化爲了Notification)。
- 應用場景: 當處理消息流時涉及到Java Class轉化或者判定相關的操作。
- 適用cast和ofType。
- 適用cast和ofType。
- 應用場景: 被動式的Observable已經不能滿足你的需求,你需要一個主動發起的消息流。
- 適用Subject,Subject既是一個Observer,又是一個Observable,因此作爲一個Observer,使用者可以主動的調用其onXXX()方法來發起一條消息流,獨立於Subscriber的subscribe來驅動消息流的產生。
- 適用Subject,Subject既是一個Observer,又是一個Observable,因此作爲一個Observer,使用者可以主動的調用其onXXX()方法來發起一條消息流,獨立於Subscriber的subscribe來驅動消息流的產生。
- 應用場景: Subscriber被異步的過程持有引用(類似於異步過程中使用Callback)從而導致即使Subscriber已經UnSubscribe(),Observable仍然持有對Subscriber的引用(不太嚴格的說法),造成內存泄漏。
- 適用onTerminateDetach,在UnSubscriber時,Observable對Subscriber的引用會被釋放,從而避免了內存泄漏。
- 適用onTerminateDetach,在UnSubscriber時,Observable對Subscriber的引用會被釋放,從而避免了內存泄漏。
- 應用場景: 在消息流出現onError()時,你希望能夠處理onError()這種消息(情況),將其轉化爲一個onNext()/Observable (比如, 提取數據失敗發出onError(),這種情況下可以將預置的數據通過onNext()發出)。
-
- 適用onErrorResumeNext,在onError出現的情況下將其轉化爲一個Obsrervable,相當於開了一條新的消息流。
- 適用onErrorReturn, 在onError出現的情況下將其轉化爲一個onNext()。
- 上述Operator(其實用的是一個Operator)提供了一種優雅的fallback實現方式