RxJava使用總結

     一些對使用RxJava的初級使用總結():
  

   

     

格式說明: 

    • Operator : 表示其是一個Operator操作。
    • Func()表示其是一個函數。

  1. ReactiveX官網: http://reactivex.io/, 建議閱讀其Docs,闡述了一些ReactiveX的基本理念和概念:
  2. 一個不錯的RxJava Operator的交互示意圖: http://rxmarbles.com/, 注意,其上面的Operator種類並不完整

  3. Operator並不神祕,其本質是裝飾模式

  4. 對Operator的使用,遵循單一職責原則,在相應的Operator中只做該Operator語義允許的操作,比如,在Map中,你只應該做類型轉化相關的操作,而不應該做和其無關的操作(side-effect-operation)。

  5. 如果你發現onNext()中的邏輯還是很複雜,那麼很大可能說明是你沒有充分利用Operator, 一般來說,onNext()中返回的數據應該是最終並直接可用的數據

  6. 對於不是非常熟悉的RxJava的API,建議先細緻閱讀其API註釋,不要遺漏任何信息,RxJava的很多函數註釋在描述中不會提示,但是在下面的參數/throw說明中會提示一些關鍵點,因此不要遺漏。

  7. 參考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())這種保險的方式來進行。

  8. 應用場景: 在onError()和onNext()中需要做同樣的善後工作。
    • 適用doOnTerminate不管消息流最終以onError()/onComplete()結束,都會被調用(類似Java的finally),對於某些需要onError()/onComplete()後都要執行的操作(如網絡加載成功/失敗都要隱藏載入中界面),可以放在這裏。

  9. 應用場景: 在subscribe時需要做一些初始化操作(比如開始加載數據時顯示載入中界面)。
    • 適用doOnSubscribe,會在Observable被Subscribe時被調用,適合在裏面做一些初始化操作(比如開始加載數據時顯示載入中界面)。

  10. doOnUnsubscribe在Observable被unsubscribe()時被調用,可以利用其做一些資源清理工作。

  11. 應用場景: 有時根本不需要關心Observable的onXXX回調,而只是想通過subscribe的方式將Observable運轉起來。
    • 適用subscribe(), 不過注意: onError()被觸發會導致拋出OnErrorNotImplementedException

  12. 應用場景: 有時候不得不提供一個Action接口對象做佔位,又懶的實現時。
    • 適用Actions.empty()

  13. 你遲早需要自己來實現OnSubscribe<T>, 那麼OnSubscribeFromArray<T>是個不錯的簡單參考

  14. 應用場景: 你先需要獲得並處理一個Collection(Map/List...), 然後遍歷對每個成員進行處理和歸總
    • 適用FlatMap,它能將信息流的負載從Collection變爲Collection中的成員

  15. RxBindinghttps://github.com/JakeWharton/RxBinding 是一個對Android的View級Reactive適配庫,把原來的Listener模式適配爲RxJava的消息流模式, 其實現機理很簡單,源碼可以一看。

  16. 應用場景: 需要對onNext/onError/onComplete做歸一化的處理。 
    • 適用materialize,會將onNext()/onError/onComplete統一封裝爲Notification類型的消息,將Observable轉化爲一個只傳遞Notification類型消息的Observable(注意,該Observable最後會觸發onComplete(), 但是和被轉化的Observable的onComplete()沒有任何關係,前者已經被轉化爲了Notification)。

  17. 應用場景當處理消息流時涉及到Java Class轉化或者判定相關的操作。
    • 適用cast和ofType。

  18. 應用場景被動式的Observable已經不能滿足你的需求,你需要一個主動發起的消息流。
    • 適用Subject,Subject既是一個Observer,又是一個Observable,因此作爲一個Observer,使用者可以主動的調用其onXXX()方法來發起一條消息流,獨立於Subscriber的subscribe來驅動消息流的產生。

  19. 應用場景: Subscriber被異步的過程持有引用(類似於異步過程中使用Callback)從而導致即使Subscriber已經UnSubscribe(),Observable仍然持有對Subscriber的引用(不太嚴格的說法),造成內存泄漏。
    • 適用onTerminateDetach,在UnSubscriber時,Observable對Subscriber的引用會被釋放,從而避免了內存泄漏。
       
  20. 應用場景: 在消息流出現onError()時,你希望能夠處理onError()這種消息(情況),將其轉化爲一個onNext()/Observable (比如, 提取數據失敗發出onError(),這種情況下可以將預置的數據通過onNext()發出)。
    • 適用onErrorResumeNext,在onError出現的情況下將其轉化爲一個Obsrervable,相當於開了一條新的消息流。
    • 適用onErrorReturn在onError出現的情況下將其轉化爲一個onNext()。
    • 上述Operator(其實用的是一個Operator)提供了一種優雅的fallback實現方式
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章