創(chuàng)建型操作符

創(chuàng)建型操作符
  • create
  • from
  • just
  • defer
  • timer
  • interval
  • range
  • repeat/repeatWhen
create操作符

create操作符是所有創(chuàng)建型操作符的“根”沃琅,也就是說其他創(chuàng)建型操作符最后都是通過create操作符來創(chuàng)建Observable的.

Observable.create(new Observable.OnSubscribe() {
        @Override
        public void call (Subscriber observer){
            try {
                if (!observer.isUnsubscribed()) {
                    for (int i = 1; i < 5; i++) {
                        observer.onNext(i);
                    }
                    observer.onCompleted();
                }
            } catch (Exception e) {
                observer.onError(e);
            }
        }
    }).subscribe(new Subscriber() {
        @Override 
        public void onNext (Integer item){
            System.out.println("Next: " + item);
        }
        @Override 
        public void onError (Throwable error){
            System.err.println("Error: " + error.getMessage());
        }
        @Override 
        public void onCompleted () {
            System.out.println("Sequence complete.");
        }
    });

運行結(jié)果如下:
Next: 1
Next: 2
Next: 3
Next: 4
Sequence complete.


from操作符

from操作符是把其他類型的對象和數(shù)據(jù)類型轉(zhuǎn)化成Observable

Integer[] items = { 0, 1, 2, 3, 4, 5 };
Observable myObservable = Observable.from(items);

myObservable.subscribe(
    new Action1<Integer>() {
        @Override
        public void call(Integer item) {
            System.out.println(item);
        }
    },
    new Action1<Throwable>() {
        @Override
        public void call(Throwable error) {
            System.out.println("Error encountered: " + error.getMessage());
        }
    },
    new Action0() {
        @Override
        public void call() {
            System.out.println("Sequence complete");
        }
    }
);

運行結(jié)果如下:
Next: 1
Next: 2
Next: 3
Next: 4
Sequence complete.


just操作符

just操作符也是把其他類型的對象和數(shù)據(jù)類型轉(zhuǎn)化成Observable忽肛,它和from操作符很像昵济,只是方法的參數(shù)有所差別

Observable.just(1, 2, 3)
          .subscribe(new Subscriber<Integer>() {
        @Override
        public void onNext(Integer item) {
            System.out.println("Next: " + item);
        }

        @Override
        public void onError(Throwable error) {
            System.err.println("Error: " + error.getMessage());
        }

        @Override
        public void onCompleted() {
            System.out.println("Sequence complete.");
        }
    });

運行結(jié)果如下:
Next: 1
Next: 2
Next: 3
Sequence complete.


defer操作符

defer操作符是直到有訂閱者訂閱時袱结,才通過Observable的工廠方法創(chuàng)建Observable并執(zhí)行美莫,defer操作符能夠保證Observable的狀態(tài)是最新的.

// 下面通過比較defer操作符和just操作符的運行結(jié)果作比較:
        i=10;
        Observable justObservable = Observable.just(i);
        i=12;
        Observable deferObservable = Observable.defer(new Func0<Observable<Object>>() {
            @Override
            public Observable<Object> call() {
                return Observable.just(i);
            }
        });
        i=15;

        justObservable.subscribe(new Subscriber() {
            @Override
            public void onCompleted() {

            }

            @Override
            public void onError(Throwable e) {

            }

            @Override
            public void onNext(Object o) {
                System.out.println("just result:" + o.toString());
            }
        });

        deferObservable.subscribe(new Subscriber() {
            @Override
            public void onCompleted() {

            }

            @Override
            public void onError(Throwable e) {

            }

            @Override
            public void onNext(Object o) {
                System.out.println("defer result:" + o.toString());
            }
        });
   }

運行結(jié)果如下:
just result:10
defer result:15


timer操作符

timer操作符是創(chuàng)建一串連續(xù)的數(shù)字菜拓,產(chǎn)生這些數(shù)字的時間間隔是一定的;
一種是隔一段時間產(chǎn)生一個數(shù)字系宫,然后就結(jié)束索昂,可以理解為延遲產(chǎn)生數(shù)字 。
一種是每隔一段時間就產(chǎn)生一個數(shù)字扩借,沒有結(jié)束符椒惨,也就是是可以產(chǎn)生無限個連續(xù)的數(shù)字 。

timer操作符默認情況下是運行在一個新線程上的潮罪,當然你可以通過傳入?yún)?shù)來修改其運行的線程.

        //每隔兩秒產(chǎn)生一個數(shù)字
        Observable.timer(2, 2, TimeUnit.SECONDS).subscribe(new Subscriber<Long>() {
            @Override
            public void onCompleted() {
                System.out.println("Sequence complete.");
            }

            @Override
            public void onError(Throwable e) {
                System.out.println("error:" + e.getMessage());
            }

            @Override
            public void onNext(Long aLong) {
                System.out.println("Next:" + aLong.toString());
            }
        });

運行結(jié)果如下:
Next:0
Next:1
Next:2
Next:3
……


interval操作符

interval操作符是每隔一段時間就產(chǎn)生一個數(shù)字康谆,這些數(shù)字從0開始,一次遞增1直至無窮大嫉到;
interval操作符的實現(xiàn)效果跟上面的timer操作符的第二種情形一樣沃暗。
interval操作符默認情況下是運行在一個新線程上的,當然你可以通過傳入?yún)?shù)來修改其運行的線程何恶。調(diào)用例子就不列出了孽锥,基本跟上面timer的調(diào)用例子一樣。

Observable.interval(3,10,TimeUnit.SECONDS).subscribe(new Subscriber<Long>() {
            @Override
            public void onCompleted() {
                System.out.println("*************onCompleted*************");
            }
            @Override
            public void onError(Throwable e) {
            }
            @Override
            public void onNext(Long aLong) {
                System.out.println("*************Next*************:" + aLong.toString());
            }
        });

運行結(jié)果如下: (開始等待三秒)
*************Next*************: 0
*************Next*************:1(隔10秒)
*************Next*************:2(隔10秒)


range操作符

range操作符是創(chuàng)建一組在從n開始细层,個數(shù)為m的連續(xù)數(shù)字惜辑,比如range(3,10),就是創(chuàng)建3疫赎、4盛撑、5…12的一組數(shù)字

        //產(chǎn)生從3開始,個數(shù)為10個的連續(xù)數(shù)字
        Observable.range(3,10).subscribe(new Subscriber<Integer>() {
            @Override
            public void onCompleted() {
                System.out.println("Sequence complete.");
            }

            @Override
            public void onError(Throwable e) {
                System.out.println("error:" + e.getMessage());
            }

            @Override
            public void onNext(Integer i) {
                System.out.println("Next:" + i.toString());
            }
        });

運行結(jié)果如下:
Next:3
Next:4
Next:5
Next:6
….
Next:12
Sequence complete.


repeat/repeatWhen操作符

repeat操作符是對某一個Observable捧搞,重復產(chǎn)生多次結(jié)果抵卫。
repeatWhen操作符是對某一個Observable,有條件地重新訂閱從而產(chǎn)生多次結(jié)果实牡。
repeat和repeatWhen操作符默認情況下是運行在一個新線程上的陌僵,當然你可以通過傳入?yún)?shù)來修改其運行的線程轴合。

  1. repeat調(diào)用例子如下:
           //連續(xù)產(chǎn)生兩組(3,4,5)的數(shù)字
        Observable.range(3,3).repeat(2).subscribe(new Subscriber<Integer>() {
            @Override
            public void onCompleted() {
                System.out.println("Sequence complete.");
            }

            @Override
            public void onError(Throwable e) {
                System.out.println("error:" + e.getMessage());
            }

            @Override
            public void onNext(Integer i) {
                System.out.println("Next:" + i.toString());
            }
        });

運行結(jié)果如下:
Next:3
Next:4
Next:5
Next:3
Next:4
Next:5
Sequence complete.


  1. repeatWhen調(diào)用例子如下:
Observable.just(1,2,3).repeatWhen(new Func1<Observable<? extends Void>, Observable<?>>() {
            @Override
            public Observable<?> call(Observable<? extends Void> observable) {
                //重復3次
                return observable.zipWith(Observable.range(1, 3), new Func2<Void, Integer, Integer>() {
                    @Override
                    public Integer call(Void aVoid, Integer integer) {
                        return integer;
                    }
                }).flatMap(new Func1<Integer, Observable<?>>() {
                    @Override
                    public Observable<?> call(Integer integer) {
                        System.out.println("delay repeat the " + integer + " count");
                        //1秒鐘重復一次
                        return Observable.timer(1, TimeUnit.SECONDS);
                    }
                });
            }
        }).subscribe(new Subscriber<Integer>() {
            @Override
            public void onCompleted() {
                System.out.println("Sequence complete.");
            }

            @Override
            public void onError(Throwable e) {
                System.err.println("Error: " + e.getMessage());
            }

            @Override
            public void onNext(Integer value) {
                System.out.println("Next:" + value);
            }
        });

運行結(jié)果如下:
Next:1
Next:2
Next:3
repeat the 1 count
Next:1
Next:2
Next:3
repeat the 2 count
Next:1
Next:2
Next:3
repeat the 3 count
Next:1
Next:2
Next:3
Sequence complete.




最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末创坞,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子受葛,更是在濱河造成了極大的恐慌题涨,老刑警劉巖偎谁,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異纲堵,居然都是意外死亡巡雨,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進店門席函,熙熙樓的掌柜王于貴愁眉苦臉地迎上來铐望,“玉大人,你說我怎么就攤上這事茂附≌埽” “怎么了?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵营曼,是天一觀的道長乒验。 經(jīng)常有香客問我,道長蒂阱,這世上最難降的妖魔是什么锻全? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮录煤,結(jié)果婚禮上鳄厌,老公的妹妹穿的比我還像新娘。我一直安慰自己妈踊,他們只是感情好部翘,可當我...
    茶點故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著响委,像睡著了一般新思。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上赘风,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天夹囚,我揣著相機與錄音,去河邊找鬼邀窃。 笑死荸哟,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的瞬捕。 我是一名探鬼主播鞍历,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼肪虎!你這毒婦竟也來了劣砍?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤扇救,失蹤者是張志新(化名)和其女友劉穎刑枝,沒想到半個月后香嗓,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡装畅,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年靠娱,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片掠兄。...
    茶點故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡像云,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蚂夕,到底是詐尸還是另有隱情苫费,我是刑警寧澤,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布双抽,位于F島的核電站百框,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏牍汹。R本人自食惡果不足惜铐维,卻給世界環(huán)境...
    茶點故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望慎菲。 院中可真熱鬧嫁蛇,春花似錦、人聲如沸露该。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽解幼。三九已至抑党,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間撵摆,已是汗流浹背底靠。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留特铝,地道東北人暑中。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像鲫剿,于是被迫代替她去往敵國和親鳄逾。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,577評論 2 353

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