Rxjava Obserable的創(chuàng)建操作符

創(chuàng)建操作符目錄

creating_observables.png

由ReactiveX: http://reactivex.io/documentation/operators.html 支持坡疼。

1: Create

Create操作符: 使用OnSubscribe從頭創(chuàng)建一個(gè)Observable侥钳。OnSubscribe會(huì)在訂閱發(fā)生時(shí)箱歧,調(diào)用內(nèi)部的call方法,實(shí)現(xiàn)調(diào)用onnext等方法淮椰。

Observable.create(new Observable.OnSubscribe<String>() {
            @Override
            public void call(Subscriber<? super String> subscriber) {
                subscriber.onNext("hello Rxjava");
            }
        }).subscribe(new Subscriber<String>() {
            @Override
            public void onCompleted() {
                Log.d(TAG, "onCompleted: ");
            }

            @Override
            public void onError(Throwable e) {
                Log.d(TAG, "onError: ");
            }

            @Override
            public void onNext(String s) {
                Log.d(TAG, "onNext: "+s);
            }
        });

結(jié)果:

03-15 16:35:18.191 27050-27050/com.nnews D/RxOperatorsTest: onNext: hello Rxjava

Observable.create中傳入OnSubscribe作為對(duì)象捂贿,當(dāng)Observable.subscribe()訂閱時(shí),會(huì)調(diào)用OnSubscribe的回調(diào)方法Call, 然后可以在Call方法中通過參數(shù)subscriber觀察者的onNext(), onError(), onCompleted()等方法執(zhí)行祝拯,就傳遞到訂閱的觀察者回調(diào)方法中。

看圖:

create.c.png

create() 方法是 RxJava 最基本的創(chuàng)造事件序列的方法,

2: Just

just操作符:將指定類型的object創(chuàng)建為Observable對(duì)象她肯,按照順序發(fā)射給Observer,調(diào)用onNext(),onNext()...佳头,最后onComplete()

Observable.just("111","222").subscribe(new Action1<String>() {
            @Override
            public void call(String string) {
                Log.d(TAG, "call: "+string+",Thead="+Thread.currentThread().getName());
            }
        });

結(jié)果:

03-15 16:27:47.644 18868-18868/com.nnews D/RxOperatorsTest: call: 111,Thead=main
03-15 16:27:47.644 18868-18868/com.nnews D/RxOperatorsTest: call: 222,Thead=main
just.c.png

源碼:

public static <T> Observable<T> just(T t1, T t2) {
        return from((T[])new Object[] { t1, t2 });
    }

可以看出鹰贵,調(diào)用了from的方法,下面介紹from

3:From

From操作符:將傳入的數(shù)組或 Iterable 拆分成具體對(duì)象Observable后康嘉,依次發(fā)射出來,調(diào)用onNext(), onNext() ..., 最后onComplete()

        String[] mArray = {"111","222"};
        Observable.from(mArray)
                .subscribe(new Action1<String>() {
                    @Override
                    public void call(String s) {
                        Log.d(TAG, "call: "+s+",Thead="+Thread.currentThread().getName());
                    }
                });

結(jié)果:

03-15 16:48:28.389 10123-10123/com.nnews D/RxOperatorsTest: call: 111,Thead=main
03-15 16:48:28.389 10123-10123/com.nnews D/RxOperatorsTest: call: 222,Thead=main

源碼:

public static <T> Observable<T> from(T[] array) {
        int n = array.length;
        if (n == 0) {
            return empty();
        } else
        if (n == 1) {
            return just(array[0]);
        }
        return create(new OnSubscribeFromArray<T>(array));
    }

可以看出砾莱,最后調(diào)用了create方法,到這里明白了凄鼻,just,from操作符最終都是調(diào)用create操作符實(shí)現(xiàn)的聚假!

from.c.png

4: Interval

Interval操作符:創(chuàng)建一個(gè)按照一定時(shí)間間隔, 發(fā)射出來的Observable.

場景:定時(shí)去獲取推送接口的消息块蚌,提通知用戶

Observable.interval(2, TimeUnit.SECONDS)
                .subscribe(new Action1<Long>() {
                    @Override
                    public void call(Long aLong) {
                        Log.d(TAG, "call: "+aLong+",Thead="+Thread.currentThread().getName());
                    }
                });

結(jié)果:

03-15 17:05:51.383 28561-28621/com.nnews D/RxOperatorsTest: call: 0,Thead=RxComputationScheduler-1
03-15 17:05:53.383 28561-28621/com.nnews D/RxOperatorsTest: call: 1,Thead=RxComputationScheduler-1
03-15 17:05:55.383 28561-28621/com.nnews D/RxOperatorsTest: call: 2,Thead=RxComputationScheduler-1
03-15 17:05:57.383 28561-28621/com.nnews D/RxOperatorsTest: call: 3,Thead=RxComputationScheduler-1
03-15 17:05:59.383 28561-28621/com.nnews D/RxOperatorsTest: call: 4,Thead=RxComputationScheduler-1
03-15 17:06:01.383 28561-28621/com.nnews D/RxOperatorsTest: call: 5,Thead=RxComputationScheduler-1

可以看到,每隔2秒膘格,打印一次峭范,注意到不是工作在主線程了哦!

interval相當(dāng)于定時(shí)器瘪贱,定時(shí)創(chuàng)建Obserable纱控,然后發(fā)射, 調(diào)用onNext()...

interval.c.png

5:Range

range操作符: 根據(jù)初始值n和數(shù)目m, 發(fā)射n,n+1,n+2...,n+m-1,范圍的數(shù)值

Android場景:獲取數(shù)據(jù)的前20條展示等

Sample:

Observable.range(16,3)
                .subscribe(new Action1<Integer>() {
                    @Override
                    public void call(Integer integer) {
                        Log.d(TAG, "call: "+integer+",Thead="+Thread.currentThread().getName());
                    }
                });

結(jié)果:

03-15 17:20:38.929 13010-13010/com.nnews D/RxOperatorsTest: call: 16,Thead=main
03-15 17:20:38.929 13010-13010/com.nnews D/RxOperatorsTest: call: 17,Thead=main
03-15 17:20:38.929 13010-13010/com.nnews D/RxOperatorsTest: call: 18,Thead=main
range.c.png

6: Repeat

repeat操作符:創(chuàng)建一個(gè)observable,然后重復(fù)發(fā)射n次

Observable.just("1")
                .repeat(5)
                .subscribe(new Subscriber<String>() {
                    @Override
                    public void onCompleted() {
                        Log.d(TAG, "onCompleted: ");
                    }

                    @Override
                    public void onError(Throwable e) {
                        Log.d(TAG, "onError: ");
                    }

                    @Override
                    public void onNext(String s) {
                        Log.d(TAG, "onNext: "+s);
                    }
                });

結(jié)果:

03-15 17:26:32.157 19799-19799/com.nnews D/RxOperatorsTest: onNext: 1
03-15 17:26:32.158 19799-19799/com.nnews D/RxOperatorsTest: onNext: 1
03-15 17:26:32.158 19799-19799/com.nnews D/RxOperatorsTest: onNext: 1
03-15 17:26:32.159 19799-19799/com.nnews D/RxOperatorsTest: onNext: 1
03-15 17:26:32.159 19799-19799/com.nnews D/RxOperatorsTest: onNext: 1
03-15 17:26:32.159 19799-19799/com.nnews D/RxOperatorsTest: onCompleted: 
repeat.c.png

7: Timer

timer操作符既可以延遲執(zhí)行一段邏輯菜秦,也可以間隔執(zhí)行一段邏輯甜害。

場景: Android 實(shí)際中,app開啟時(shí)球昨,延時(shí)加載初始化數(shù)據(jù)尔店,然后跳到新頁面

**Sample: **

/***
         * 延時(shí)5秒,app啟動(dòng)時(shí)主慰,加載圖片嚣州,然后開啟新頁面
         */
        Observable.timer(5, TimeUnit.SECONDS)
                .subscribe(new Action1<Long>() {
                    @Override
                    public void call(Long aLong) {
                        mActivity.startActivity(new Intent(mActivity, newActivity));
                    }
                });

第二個(gè)方法,還可以調(diào)度線程


Paste_Image.png
Paste_Image.png

8.empty/Never/Throw

Empty:創(chuàng)建一個(gè)不發(fā)射任何數(shù)據(jù)但是正常終止的Observable共螺, 只調(diào)用onComplete方法

Paste_Image.png

Never:創(chuàng)建一個(gè)不發(fā)射數(shù)據(jù)也不終止的Observable, 不調(diào)用observer的方法

Paste_Image.png

Throw :創(chuàng)建一個(gè)不發(fā)射數(shù)據(jù)以一個(gè)錯(cuò)誤終止的Observable该肴,只調(diào)用onError方法

Paste_Image.png

總結(jié):上述的創(chuàng)建操作符看源碼會(huì)發(fā)現(xiàn),最終都是創(chuàng)建Observale然后發(fā)射給observer藐不,由被觀察者調(diào)用了觀察者的回調(diào)方法匀哄,就實(shí)現(xiàn)了由被觀察者向觀察者的事件傳遞,即觀察者模式佳吞。

到這里常用的 “創(chuàng)建操作符” 就好了拱雏,有時(shí)看了還是人家的,多敲敲代碼底扳,看看Api铸抑,成為自己的,用到項(xiàng)目中衷模,實(shí)現(xiàn)它的價(jià)值鹊汛!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末蒲赂,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子刁憋,更是在濱河造成了極大的恐慌滥嘴,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,104評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件至耻,死亡現(xiàn)場離奇詭異若皱,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)尘颓,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門走触,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人疤苹,你說我怎么就攤上這事互广。” “怎么了卧土?”我有些...
    開封第一講書人閱讀 168,697評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵惫皱,是天一觀的道長。 經(jīng)常有香客問我尤莺,道長旅敷,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,836評(píng)論 1 298
  • 正文 為了忘掉前任缝裁,我火速辦了婚禮扫皱,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘捷绑。我一直安慰自己韩脑,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,851評(píng)論 6 397
  • 文/花漫 我一把揭開白布粹污。 她就那樣靜靜地躺著段多,像睡著了一般。 火紅的嫁衣襯著肌膚如雪壮吩。 梳的紋絲不亂的頭發(fā)上进苍,一...
    開封第一講書人閱讀 52,441評(píng)論 1 310
  • 那天,我揣著相機(jī)與錄音鸭叙,去河邊找鬼觉啊。 笑死,一個(gè)胖子當(dāng)著我的面吹牛沈贝,可吹牛的內(nèi)容都是我干的杠人。 我是一名探鬼主播,決...
    沈念sama閱讀 40,992評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼嗡善!你這毒婦竟也來了辑莫?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,899評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤罩引,失蹤者是張志新(化名)和其女友劉穎各吨,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體袁铐,經(jīng)...
    沈念sama閱讀 46,457評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡揭蜒,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,529評(píng)論 3 341
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了剔桨。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片忌锯。...
    茶點(diǎn)故事閱讀 40,664評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖领炫,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情张咳,我是刑警寧澤帝洪,帶...
    沈念sama閱讀 36,346評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站脚猾,受9級(jí)特大地震影響葱峡,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜龙助,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,025評(píng)論 3 334
  • 文/蒙蒙 一砰奕、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧提鸟,春花似錦军援、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至赡鲜,卻和暖如春空厌,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背银酬。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評(píng)論 1 272
  • 我被黑心中介騙來泰國打工嘲更, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人揩瞪。 一個(gè)月前我還...
    沈念sama閱讀 49,081評(píng)論 3 377
  • 正文 我出身青樓赋朦,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子北发,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,675評(píng)論 2 359

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

  • 作者: maplejaw本篇只解析標(biāo)準(zhǔn)包中的操作符纹因。對(duì)于擴(kuò)展包,由于使用率較低琳拨,如有需求瞭恰,請(qǐng)讀者自行查閱文檔。 創(chuàng)...
    maplejaw_閱讀 45,697評(píng)論 8 93
  • 本篇文章介主要紹RxJava中操作符是以函數(shù)作為基本單位狱庇,與響應(yīng)式編程作為結(jié)合使用的惊畏,對(duì)什么是操作、操作符都有哪些...
    嘎啦果安卓獸閱讀 2,866評(píng)論 0 10
  • 注:只包含標(biāo)準(zhǔn)包中的操作符密任,用于個(gè)人學(xué)習(xí)及備忘參考博客:http://blog.csdn.net/maplejaw...
    小白要超神閱讀 2,199評(píng)論 2 8
  • 注:只包含標(biāo)準(zhǔn)包中的操作符颜启,用于個(gè)人學(xué)習(xí)及備忘參考博客:http://blog.csdn.net/maplejaw...
    小白要超神閱讀 940評(píng)論 0 3
  • 今天是七夕淹遵,也是你在他身邊工作的第二年口猜。 2014年他從國外回來,你便一直在他身邊工作透揣。你知道這個(gè)機(jī)會(huì)來之不易济炎,所...
    Daosy_氵閱讀 393評(píng)論 0 1