RxJava2 中容易混淆的函數(shù)

原文鏈接

create()、defer()、fromCallable()、fromFuture()

  • create():創(chuàng)建一個自定義的Obserable,需要自己實現(xiàn)onNext()、onError()、onComplete()的邏輯;
  • defer():這個方法很有用,defer操作符需要指定一個Obserable的工廠方法,然后它只會在有訂閱者訂閱它時才會創(chuàng)建Obserable,而且是為每個訂閱者創(chuàng)建自己的Obserable;
  • fromCallable():與defer()相似,但是fromCallable()返回的是onNext傳遞的數(shù)據(jù),而defer()返回的是新的Obserable。fromCallable()獲取要發(fā)送的數(shù)據(jù)的代碼只會在有Observer訂閱之后執(zhí)行,且獲取數(shù)據(jù)的代碼可以在子線程中執(zhí)行。
  • fromFuture():接收一個Future對象,會同步等待Future返回的結(jié)果再發(fā)送數(shù)據(jù),也可以設(shè)置等待超時時間。

interval()、timer()、delay()

  • interval():創(chuàng)建一個按固定時間間隔發(fā)射整數(shù)序列的Observable,類似于TimerTask定時器的功能;
  • timer():新版本的timer()只是用來創(chuàng)建一個Observable,并延遲發(fā)送一次的操作符;
  • delay():延遲一段指定的時間再發(fā)送來自O(shè)bservable的發(fā)送結(jié)果,常規(guī)使用跟timer()一致,區(qū)別在于delay()是用于流中的操作,跟map()、flatMap()的級別是一樣的。而timer()是用于創(chuàng)建Observable,跟just()、from()的級別是一樣的。

flatMap()、map()

  • flatMap():一般用于輸出一個Observable,而其隨后的subscribe中的參數(shù)也跟Observable中的參數(shù)一樣,注意不是Observable,一般用于對原始數(shù)據(jù)返回一個Observable,這個Observable中數(shù)據(jù)類型可以是原來的,也可以是其他的;
  • map():一般用于對原始的參數(shù)進行加工處理,返回值還是基本的類型,可以在subscribe中使用(適用)的類型。

flatMap和map操作符很相像,flatMap發(fā)送的是合并后的Observables,map操作符發(fā)送的是應(yīng)用函數(shù)后返回的結(jié)果集,也可以通俗地理解為flatMap用于轉(zhuǎn)化Obserable,而map用于轉(zhuǎn)化結(jié)果。

merge()、concat()、amb()、zip()

  • merge():將幫助你把兩個甚至更多的Observables合并到他們發(fā)射的數(shù)據(jù)里。如果Observables運行在不同的線程,那發(fā)送的數(shù)據(jù)可能是交替的,即先接收到哪個Observable的數(shù)據(jù)就發(fā)送誰的數(shù)據(jù);
  • concat():與merge()類似,同樣是把兩個甚至更多的Observables合并到他們發(fā)射的數(shù)據(jù)里。不同點在于concat()會按順序發(fā)送數(shù)據(jù),即第一個Observable發(fā)送完了數(shù)據(jù)才執(zhí)行第二個Observable;
  • amb():對于給定兩個或多個Observables,它只發(fā)射首先發(fā)射數(shù)據(jù)或通知的那個Observable的所有數(shù)據(jù)。也就是說amb()只會發(fā)送一個Obserable的數(shù)據(jù),其它的會被取消;
  • zip():對于給定兩個或多個Observables,它會把每個Obserable的數(shù)據(jù)按發(fā)送順序組合并回調(diào),讓用戶自己根據(jù)每個Obserable決定要發(fā)送的數(shù)據(jù)。

concatMap()、switchMap()

  • concatMap():concatMap()和flatMap()很像,但是flatMap()可能交錯的發(fā)送事件,最終結(jié)果的順序可能并是不原始Observable發(fā)送時的順序,concatMap()操作符則可以保證按順序發(fā)送結(jié)果集;
  • switchMap():switchMap()和flatMap()很像,除了一點:當源Observable發(fā)射一個新的數(shù)據(jù)項時,如果舊數(shù)據(jù)項訂閱還未完成,就取消舊訂閱數(shù)據(jù)和停止監(jiān)視那個數(shù)據(jù)項產(chǎn)生的Observable,開始監(jiān)視新的數(shù)據(jù)項;

repeat()、repeatWhen()、repeatUtil()

  • repeat()接收到.onCompleted()事件后觸發(fā)重訂閱??梢詡鬟f參數(shù)設(shè)定有限次數(shù)的重試;
  • repeatWhen():指示Observable遇到onCompleted()時,將結(jié)果傳遞給另一個Observable來決定是否要重新給訂閱這個Observable;
  • repeatUtil():指示Observable遇到onCompleted()時,將結(jié)果傳遞給repeatUtil的回調(diào)函數(shù)決定是否要重新給訂閱這個Observable,返回false重新訂閱,返回true取消訂閱。

retry()、retryWhen()、retryUtil()

  • retry()接收到.onError()事件后觸發(fā)重訂閱??梢詡鬟f參數(shù)設(shè)定有限次數(shù)的重試;
  • retryWhen():指示Observable遇到錯誤時,將錯誤傳遞給另一個Observable來決定是否要重新給訂閱這個Observable。
  • retryUtil():指示Observable遇到onError()時,將結(jié)果傳遞給retryUtil的回調(diào)函數(shù)決定是否要重新給訂閱這個Observable,返回false重新訂閱,返回true取消訂閱。

repeat()、retry()這些只能控制重新的次數(shù),repeatUtil()、retryUtil()可以控制要不要重試,但是這些重新訂閱都是Rxjava自動操作的,也就是你不能再改變訂閱后的行為。比如如果你要實現(xiàn)一個延遲數(shù)秒的重訂閱該如何去做?或者想通過觀察錯誤來決定是否應(yīng)該重訂閱呢?這種情況下就需要.repeatWhen()和.retryWhen();

takeUtil()、skipUtil()

  • takeUtil():持續(xù)接收第一Obserable(調(diào)用takUtil的Obserable)發(fā)送的數(shù)據(jù),當?shù)诙﨩bserable(takUtil參數(shù)中的Obserable)發(fā)送數(shù)據(jù)時兩個Obserable會同時取消訂閱。
  • skipUtil():與takeUtil()正好相反,不接收第一Obserable(調(diào)用takUtil的Obserable)發(fā)送的數(shù)據(jù),直到第二Obserable(takUtil參數(shù)中的Obserable)發(fā)送數(shù)據(jù)時才接收第一Obserable的數(shù)據(jù),此時第二Obserable會取消訂閱。

takeWhile()、skipWhile()

  • takeWhile():與takeUtil()類似,不過傳遞的不是Obserable,而是Predicate,用于判斷是否接收數(shù)據(jù),返回true就接收,返回false就不接收,一旦返回false這個Predicate也不會被調(diào)用了;
  • skipWhile():與skipUtil()類似,不過傳遞的不是Obserable,而是Predicate,用于判斷是否接收數(shù)據(jù),返回true就不接收,返回false就接收,一旦接收這個Predicate也不會被調(diào)用了;

參考

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容