RxJava2.0使用總結(jié)

這里是我對Rxjava2.0的一些學(xué)習(xí)總結(jié),在此記錄一下愉镰,以后用的時候也方便查找。

如何使用RxJava2

在Android中使用RxJava2只需要在app下的Gradle文件中配置以下兩句即可:

   compile 'io.reactivex.rxjava2:rxjava:2.0.1'
   compile 'io.reactivex.rxjava2:rxandroid:2.0.1'

了解了如何使用Rxjava2,基礎(chǔ)的東西就先不提起宽,這里說一下RxJava2中一些重要的操作符吧。
事件是從產(chǎn)生它的地方(上游)遮斥,傳遞到接收它的地方(下游)。在這個傳遞的過程中我們可以通過一系列的操作符對數(shù)據(jù)進行修改商膊。

操作符之Map

map操作符用于轉(zhuǎn)換一組數(shù)據(jù)伏伐,可以是對數(shù)據(jù)簡單的加減乘除這種轉(zhuǎn)換,也可以將一個類轉(zhuǎn)成另一個類晕拆。并且map是單一轉(zhuǎn)換藐翎,看下面代碼:

        Flowable.just(123)
                .map(new Function<Integer, String>() {
                    @Override
                    public String apply(Integer integer) throws Exception {
                        return 123+"456";
                    }
                }).subscribe(new Consumer<String>() {
                    @Override
                    public void accept(String s) throws Exception {
                        Log.e("accept", "======" + s);
                    }
                });

按照以上的代碼來說,上游發(fā)送的數(shù)據(jù)是123实幕,下游也應(yīng)該接收到123吝镣,不過這里我們用map進行了變換,把123這個數(shù)字改成了“123456”這個字符串昆庇。所以打印結(jié)果是:

10-11 16:02:39.400 6374-6374/com.example.administrator.rxdemo E/accept: ======123456

也就是說map在對Flowable對象進行變換之后返回了一個新的Flowable對象末贾,然后進行之下的操作。

操作符之FlatMap

flatMap操作符的作用是將上游發(fā)送來的單個事件都轉(zhuǎn)化成一個新的Flowable,這個Flowable中又包含若干個事件整吆。然后發(fā)送這些事件拱撵。看下面代碼:

    Flowable.create(new FlowableOnSubscribe<Integer>() {
            @Override
            public void subscribe(FlowableEmitter<Integer> e) throws Exception {
                e.onNext(11);
                e.onNext(12);
                e.onNext(13);
                e.onComplete();
            }
        }, BackpressureStrategy.ERROR)
           .flatMap(new Function<Integer, Publisher<String>>() {
            @Override
            public Publisher<String> apply(Integer integer) throws Exception {
                List<String> list=new ArrayList<String>();
                for (int i = 0; i < 2; i++) {
                    list.add(integer+"abc");
                }
                return Flowable.fromIterable(list);
            }
        }).subscribe(new Consumer<String>() {
            @Override
            public void accept(String s) throws Exception {
                Log.e("accept", "======" + s);
            }
        });

打印結(jié)果是:

.administrator.rxdemo E/accept: ======11abc
.administrator.rxdemo E/accept: ======11abc
.administrator.rxdemo E/accept: ======12abc
.administrator.rxdemo E/accept: ======12abc
.administrator.rxdemo E/accept: ======13abc
.administrator.rxdemo E/accept: ======13abc

flatMap不保證事件發(fā)送的順序表蝙,也就是說上面代碼的順序不見得就是11abc拴测,12abc,13abc,上面代碼沒有體現(xiàn)出無序的特點府蛇,發(fā)送事件的時候加上幾秒延遲就能看到了集索。

操作符之ConcatMap

concatMap的做用和flatMap一模一樣,唯一的區(qū)別就在于cancatMap保證事件發(fā)送的順序是有序的汇跨,即嚴格按照上游發(fā)送的順序务荆。

操作符之take
take操作符非常簡單,用于指定訂閱者最多收到多少數(shù)據(jù)穷遂,使用起來也是很簡單:

   .take(12)

這里就表示訂閱者最多能接收到12個數(shù)據(jù)函匕。

操作符之filter

filter操作符的作用是過濾數(shù)據(jù),也就是對于上游發(fā)送的數(shù)據(jù)進行篩選蚪黑,看代碼:

         Flowable.create(new FlowableOnSubscribe<Integer>() {
            @Override
            public void subscribe(FlowableEmitter<Integer> e) throws Exception {
                e.onNext(10);
                e.onNext(11);
                e.onNext(12);
                e.onNext(13);
                e.onNext(14);
                e.onComplete();
            }
        }, BackpressureStrategy.ERROR)
           .filter(new Predicate<Integer>() {
               @Override
               public boolean test(Integer integer) throws Exception {
                   if(integer>12){
                       return true;
                   }
                   return false;
               }
           }).subscribe(new Consumer<Integer>() {
            @Override
            public void accept(Integer integer) throws Exception {
                Log.e("accept", "======" + integer);
            }
        });

打印結(jié)果是:

.example.administrator.rxdemo E/accept: ======13
.example.administrator.rxdemo E/accept: ======14

通過代碼和打印結(jié)果可以清楚的看到通過filter操作符篩選之后浦箱,從上游發(fā)送的數(shù)據(jù)10,11祠锣,12酷窥,13,14伴网,并沒有完全被下游接收蓬推。只有13,14被接收了澡腾。也就是說filter操作符起了作用沸伏。

操作符之doOnNext

doOnNext的作用就是在每個事件被處理之前做一些操作糕珊。下面代碼我是讓每次處理事件之前都打印一句“哈哈哈”,看代碼就清楚了:

        Flowable.create(new FlowableOnSubscribe<Integer>() {
            @Override
            public void subscribe(FlowableEmitter<Integer> e) throws Exception {
                e.onNext(12);
                e.onNext(13);
                e.onNext(14);
                e.onComplete();
            }
        }, BackpressureStrategy.ERROR)
         .doOnNext(new Consumer<Integer>() {
             @Override
             public void accept(Integer integer) throws Exception {
                 Log.e("accept", "======" + "哈哈哈");
             }
         }).subscribe(new Consumer<Integer>() {
            @Override
            public void accept(Integer integer) throws Exception {
                Log.e("accept", "======" + integer);
            }
        });

注意看打印結(jié)果:

.example.administrator.rxdemo E/accept: ======哈哈哈
.example.administrator.rxdemo E/accept: ======12
.example.administrator.rxdemo E/accept: ======哈哈哈
.example.administrator.rxdemo E/accept: ======13
.example.administrator.rxdemo E/accept: ======哈哈哈
.example.administrator.rxdemo E/accept: ======14

很清楚了毅糟,每次處理事件(打印數(shù)字)之前都先做了打印“哈哈哈”這件事红选,也就是我們的doOnNext操作符起了作用。

操作符之zip
zip操作符的目的是合并多個被觀察者的數(shù)據(jù)流姆另,然后發(fā)送最終合并的數(shù)據(jù)喇肋。有一種場景是 當(dāng)某界面內(nèi)容來源不同,但需同時顯示出來時迹辐。這時候就可以使用zip操作符蝶防,zip操作符可以將幾方數(shù)據(jù)組合好后同時展示出來。
zip事件的過程就是分別從發(fā)射器 A 和發(fā)射器 B 各取出一個事件來組合明吩,并且一個事件只能被使用一次间学,組合的順序是嚴格按照事件發(fā)送的順序來進行的,比如印荔,A為12345低葫,B為ABCD,1 永遠是和 A 結(jié)合的,2 永遠是和 B 結(jié)合的仍律。
最終接收器收到的事件數(shù)量是和發(fā)送器發(fā)送事件最少的那個發(fā)送器的發(fā)送事件數(shù)目相同嘿悬。

Rxjava2中的操作符有很多,這里只寫出了一小部分染苛。趁著剛學(xué)了記錄一下鹊漠。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末主到,一起剝皮案震驚了整個濱河市茶行,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌登钥,老刑警劉巖畔师,帶你破解...
    沈念sama閱讀 221,635評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異牧牢,居然都是意外死亡看锉,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評論 3 399
  • 文/潘曉璐 我一進店門塔鳍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來伯铣,“玉大人,你說我怎么就攤上這事轮纫∏还眩” “怎么了?”我有些...
    開封第一講書人閱讀 168,083評論 0 360
  • 文/不壞的土叔 我叫張陵掌唾,是天一觀的道長放前。 經(jīng)常有香客問我忿磅,道長,這世上最難降的妖魔是什么凭语? 我笑而不...
    開封第一講書人閱讀 59,640評論 1 296
  • 正文 為了忘掉前任葱她,我火速辦了婚禮,結(jié)果婚禮上似扔,老公的妹妹穿的比我還像新娘吨些。我一直安慰自己,他們只是感情好虫几,可當(dāng)我...
    茶點故事閱讀 68,640評論 6 397
  • 文/花漫 我一把揭開白布锤灿。 她就那樣靜靜地躺著,像睡著了一般辆脸。 火紅的嫁衣襯著肌膚如雪但校。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,262評論 1 308
  • 那天啡氢,我揣著相機與錄音状囱,去河邊找鬼。 笑死倘是,一個胖子當(dāng)著我的面吹牛亭枷,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播搀崭,決...
    沈念sama閱讀 40,833評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼叨粘,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了瘤睹?” 一聲冷哼從身側(cè)響起升敲,我...
    開封第一講書人閱讀 39,736評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎轰传,沒想到半個月后驴党,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,280評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡获茬,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,369評論 3 340
  • 正文 我和宋清朗相戀三年港庄,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片恕曲。...
    茶點故事閱讀 40,503評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡鹏氧,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出佩谣,到底是詐尸還是另有隱情把还,我是刑警寧澤,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站笨篷,受9級特大地震影響瞳秽,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜率翅,卻給世界環(huán)境...
    茶點故事閱讀 41,870評論 3 333
  • 文/蒙蒙 一练俐、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧冕臭,春花似錦腺晾、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,340評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至托慨,卻和暖如春鼻由,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背厚棵。 一陣腳步聲響...
    開封第一講書人閱讀 33,460評論 1 272
  • 我被黑心中介騙來泰國打工蕉世, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人婆硬。 一個月前我還...
    沈念sama閱讀 48,909評論 3 376
  • 正文 我出身青樓狠轻,卻偏偏與公主長得像,于是被迫代替她去往敵國和親彬犯。 傳聞我的和親對象是個殘疾皇子向楼,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,512評論 2 359

推薦閱讀更多精彩內(nèi)容