RxJava(三)操作符的使用

一:創(chuàng)建操作符
1.create:建議你在傳遞給create方法的函數(shù)中檢查觀察者的isUnsubscribed狀態(tài)闪彼,以便在沒(méi)有觀察者的時(shí)候续崖,讓你的Observable停止發(fā)射數(shù)據(jù)或者做昂貴的運(yùn)算商佛。
       Observable.create(new ObservableOnSubscribe<String>() {
            @Override
            public void subscribe(ObservableEmitter<String> e) throws Exception {
                if (!e.isDisposed()){
                  e.onNext("1");
                  e.onNext("2");
                  e.onNext("3");
                }
                e.onComplete();
            }
        }).subscribe(new Observer<String>() {
            @Override
            public void onSubscribe(Disposable d) {

            }

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

            @Override
            public void onError(Throwable e) {

            }

            @Override
            public void onComplete() {

            }
        });
2.Defer :操作符會(huì)一直等待直到有觀察者訂閱它慎冤,然后它使用Observable工廠方法生成一個(gè)Observable。它對(duì)每個(gè)觀察者都這樣做虏缸,因此盡管每個(gè)訂閱者都以為自己訂閱的是同一個(gè)Observable鲫懒,事實(shí)上每個(gè)訂閱者獲取的是它們自己的單獨(dú)的數(shù)據(jù)序列。

在某些情況下刽辙,等待直到最后一分鐘(就是知道訂閱發(fā)生時(shí))才生成Observable可以確保Observable包含最新的數(shù)據(jù)窥岩。


public class CourseThreeActivity extends AppCompatActivity {
    private final static  String TAG = "CourseThreeActivity";
    private int num = 10;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_course_three);
        Observable<Integer> observable = Observable.just(num);
        num =20;
        Subscriber<Integer> subscriber = new Subscriber<Integer>() {
            @Override
            public void onCompleted() {

            }

            @Override
            public void onError(Throwable e) {

            }

            @Override
            public void onNext(Integer integer) {
                Log.e(TAG,integer+"");
            }
        };
        observable.subscribe(subscriber);
    }
}

運(yùn)行結(jié)果如下

20244-20244/com.pse.rxandroid E/CourseThreeActivity: 10

可見(jiàn)當(dāng)我們調(diào)用Just 時(shí)該Observerable 的數(shù)據(jù)已經(jīng)固定。即使在下面做出更改也不會(huì)造成影響宰缤。
那我們?cè)賮?lái)看看defer

public class CourseThreeActivity extends AppCompatActivity {
    private final static  String TAG = "CourseThreeActivity";
    private int num = 10;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_course_three);
        Observable<Integer> observable = Observable.defer(new Func0<Observable<Integer>>() {
            @Override
            public Observable<Integer> call() {
                return Observable.just(num);
            }
        });
        num =20;
        Subscriber<Integer> subscriber = new Subscriber<Integer>() {
            @Override
            public void onCompleted() {

            }

            @Override
            public void onError(Throwable e) {

            }

            @Override
            public void onNext(Integer integer) {
                Log.e(TAG,integer+"");
            }
        };
        observable.subscribe(subscriber);
    }
}

運(yùn)行結(jié)果如下

21658-21658/com.pse.rxandroid E/CourseThreeActivity: 20

現(xiàn)在想必大家能夠理解defer 的作用了吧(等待訂閱颂翼,獲取最新值)。

3.From :將其它種類的對(duì)象和數(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é)果大家可想而知慨灭,不過(guò)在這里有一個(gè)新的操作符Action0朦乏,其實(shí)看過(guò)源碼就會(huì)知道Action可以有多個(gè)參數(shù),方便我們來(lái)重寫氧骤,處理自己的需求呻疹,這里我們只是模擬Observer創(chuàng)建了 onNext(),onError(),onComplete().

4.Range:創(chuàng)建一個(gè)發(fā)射特定整數(shù)序列的Observable

示例代碼如下

  Observable.range(5,10).subscribe(new Action1<Integer>() {
            @Override
            public void call(Integer integer) {
                Log.e(TAG,integer+"");
            }
        });

這里我們只是為了測(cè)試,所以只處理onNext()事件筹陵。
運(yùn)行結(jié)果如下

03-07 14:01:34.029 7672-7672/com.pse.rxandroid E/CourseThreeActivity: 5
03-07 14:01:34.029 7672-7672/com.pse.rxandroid E/CourseThreeActivity: 6
03-07 14:01:34.029 7672-7672/com.pse.rxandroid E/CourseThreeActivity: 7
03-07 14:01:34.029 7672-7672/com.pse.rxandroid E/CourseThreeActivity: 8
03-07 14:01:34.029 7672-7672/com.pse.rxandroid E/CourseThreeActivity: 9
03-07 14:01:34.029 7672-7672/com.pse.rxandroid E/CourseThreeActivity: 10
03-07 14:01:34.029 7672-7672/com.pse.rxandroid E/CourseThreeActivity: 11
03-07 14:01:34.029 7672-7672/com.pse.rxandroid E/CourseThreeActivity: 12
03-07 14:01:34.029 7672-7672/com.pse.rxandroid E/CourseThreeActivity: 13
03-07 14:01:34.029 7672-7672/com.pse.rxandroid E/CourseThreeActivity: 14
5.Repeat :創(chuàng)建一個(gè)發(fā)射特定數(shù)據(jù)重復(fù)多次的Observable
  Observable<String> observable = Observable.just("hell Word");
        observable.repeat(4).subscribe(new Action1<String>() {
            @Override
            public void call(String s) {
                Log.e(TAG,s);
            }
        });

運(yùn)行結(jié)果如下,會(huì)連續(xù)發(fā)射4四次Observerable(同一個(gè))

03-07 14:13:11.723 17500-17500/com.pse.rxandroid E/CourseThreeActivity: hell Word
03-07 14:13:11.725 17500-17500/com.pse.rxandroid E/CourseThreeActivity: hell Word
03-07 14:13:11.725 17500-17500/com.pse.rxandroid E/CourseThreeActivity: hell Word
03-07 14:13:11.725 17500-17500/com.pse.rxandroid E/CourseThreeActivity: hell Word
6.Timer:創(chuàng)建一個(gè)Observerable刽锤,并在一定的延時(shí)后發(fā)射一個(gè)特定的值“0”

示例如下

        Observable<Long> observable = Observable.timer(2, TimeUnit.SECONDS);
        observable.subscribe(new Action1<Long>() {
            @Override
            public void call(Long aLong) {
                Log.e(TAG,aLong+"");
            }
        });

運(yùn)行結(jié)果如下

26279-26302/com.pse.rxandroid E/CourseThreeActivity: 0

在日常中我們經(jīng)常做倒計(jì)時(shí)操作,之前使用的是Handler 現(xiàn)在你可以嘗試改用RX實(shí)現(xiàn)了惶翻。

7.MAP():最重要的變換操作符姑蓝,對(duì)Observable發(fā)射的每一項(xiàng)數(shù)據(jù)應(yīng)用一個(gè)函數(shù),執(zhí)行變換操作

大家可以試著理解下這個(gè)圖:



上面這張圖我可以舉個(gè)例子吕粗,比如幼兒園舉行活動(dòng)纺荧,我們要給每個(gè)孩子穿上禮服,那么這個(gè)map()就是我們換衣服這個(gè)方法,所有的孩子經(jīng)過(guò)map()后都會(huì)穿上華麗的禮服宙暇。這樣的方式我們就會(huì)很快理解上圖的意義输枯。
示例如下

     Observable.create(new Observable.OnSubscribe<Integer>() {
            @Override
            public void call(Subscriber<? super Integer> subscriber) {
                    Log.e(TAG,1+"");
                    subscriber.onNext(1);
                    subscriber.onCompleted();
            }
        }).map(new Func1<Integer, String>() {
            @Override
            public String call(Integer integer) {
                return integer+"||";
            }
        }).subscribe(new Action1<String>() {
            @Override
            public void call(String s) {
                Log.e(TAG,s);
            }
        });
03-07 14:38:08.358 7900-7900/? E/CourseThreeActivity: 1
03-07 14:38:08.358 7900-7900/? E/CourseThreeActivity: 1||

從上面看出來(lái),我們發(fā)射的數(shù)據(jù)是整數(shù)類型占贫,但經(jīng)過(guò)Map()后就變?yōu)镾tring類型桃熄,這個(gè)操作符默認(rèn)不在任何特定的調(diào)度器上執(zhí)行。(有序)

8.FlatMap():將一個(gè)發(fā)射數(shù)據(jù)的Observable變換為多個(gè)Observables型奥,然后將它們發(fā)射的數(shù)據(jù)合并后放進(jìn)一個(gè)單獨(dú)的Observable,聽(tīng)著有點(diǎn)繞口瞳收,那么我們看下示例

我們先在頁(yè)面建立以下代碼

  Observable.just(1, 2, 3, 4, 5, 6, 7)
                .flatMap(new Func1<Integer, Observable<String>>() {
                    @Override
                    public Observable<String> call(Integer integer) {
                        return getObserverable(integer);
                    }
                }).subscribe(
                new Action1<String>() {
                    @Override
                    public void call(String s) {
                        Log.e(TAG,s);
                    }
                }, new Action1<Throwable>() {
                    @Override
                    public void call(Throwable throwable) {
                        Log.e(TAG,throwable.getMessage());
                    }
                }
        );

    private Observable<String> getObserverable(final int id) {
        return Observable.create(new Observable.OnSubscribe<String>() {
            @Override
            public void call(Subscriber<? super String> subscriber) {
                subscriber.onNext("This is the" + id);
                subscriber.onCompleted();
            }
        });
    }

結(jié)果如下

om.pse.rxandroid E/CourseThreeActivity: This is the1 
om.pse.rxandroid E/CourseThreeActivity: This is the2 
om.pse.rxandroid E/CourseThreeActivity: This is the3 
om.pse.rxandroid E/CourseThreeActivity: This is the4 
om.pse.rxandroid E/CourseThreeActivity: This is the5 
om.pse.rxandroid E/CourseThreeActivity: This is the6 
om.pse.rxandroid E/CourseThreeActivity: This is the7 
9.Merge合并多個(gè)Observables的發(fā)射物

示例代碼如下


Observable<Integer> odds = Observable.just(1, 3, 5).subscribeOn(someScheduler);
Observable<Integer> evens = Observable.just(2, 4, 6);

Observable.merge(odds, evens)
          .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.");
        }
    });

運(yùn)行結(jié)果如下

Next: 1
Next: 3
Next: 5
Next: 2
Next: 4
Next: 6
Sequence complete.

以上是我們?nèi)粘i_(kāi)發(fā)要用到的一些操作符,但是RxJava 可不止這些厢汹,如有需要可以去這里學(xué)習(xí)螟深。
RxJava中文學(xué)習(xí)文檔

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市烫葬,隨后出現(xiàn)的幾起案子界弧,更是在濱河造成了極大的恐慌,老刑警劉巖搭综,帶你破解...
    沈念sama閱讀 211,948評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件垢箕,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡兑巾,警方通過(guò)查閱死者的電腦和手機(jī)条获,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,371評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)闪朱,“玉大人月匣,你說(shuō)我怎么就攤上這事》茏耍” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 157,490評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵素标,是天一觀的道長(zhǎng)称诗。 經(jīng)常有香客問(wèn)我,道長(zhǎng)头遭,這世上最難降的妖魔是什么寓免? 我笑而不...
    開(kāi)封第一講書人閱讀 56,521評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮计维,結(jié)果婚禮上袜香,老公的妹妹穿的比我還像新娘。我一直安慰自己鲫惶,他們只是感情好蜈首,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,627評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著,像睡著了一般欢策。 火紅的嫁衣襯著肌膚如雪吆寨。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 49,842評(píng)論 1 290
  • 那天踩寇,我揣著相機(jī)與錄音啄清,去河邊找鬼。 笑死俺孙,一個(gè)胖子當(dāng)著我的面吹牛辣卒,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播睛榄,決...
    沈念sama閱讀 38,997評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼荣茫,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了懈费?” 一聲冷哼從身側(cè)響起计露,我...
    開(kāi)封第一講書人閱讀 37,741評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎憎乙,沒(méi)想到半個(gè)月后票罐,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,203評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡泞边,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,534評(píng)論 2 327
  • 正文 我和宋清朗相戀三年该押,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片阵谚。...
    茶點(diǎn)故事閱讀 38,673評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蚕礼,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出梢什,到底是詐尸還是另有隱情奠蹬,我是刑警寧澤,帶...
    沈念sama閱讀 34,339評(píng)論 4 330
  • 正文 年R本政府宣布嗡午,位于F島的核電站囤躁,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏荔睹。R本人自食惡果不足惜狸演,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,955評(píng)論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望僻他。 院中可真熱鬧宵距,春花似錦、人聲如沸吨拗。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,770評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至翩瓜,卻和暖如春受扳,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背兔跌。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,000評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工勘高, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人坟桅。 一個(gè)月前我還...
    沈念sama閱讀 46,394評(píng)論 2 360
  • 正文 我出身青樓华望,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親仅乓。 傳聞我的和親對(duì)象是個(gè)殘疾皇子赖舟,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,562評(píng)論 2 349

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

  • 本篇文章介主要紹RxJava中操作符是以函數(shù)作為基本單位,與響應(yīng)式編程作為結(jié)合使用的夸楣,對(duì)什么是操作宾抓、操作符都有哪些...
    嘎啦果安卓獸閱讀 2,851評(píng)論 0 10
  • 作者: maplejaw本篇只解析標(biāo)準(zhǔn)包中的操作符。對(duì)于擴(kuò)展包豫喧,由于使用率較低石洗,如有需求,請(qǐng)讀者自行查閱文檔紧显。 創(chuàng)...
    maplejaw_閱讀 45,632評(píng)論 8 93
  • 前言 按照官方的分類讲衫,操作符大致分為以下幾種: Creating Observables(Observable的創(chuàng)...
    小玉1991閱讀 1,043評(píng)論 0 1
  • 創(chuàng)建操作 用于創(chuàng)建Observable的操作符Create通過(guò)調(diào)用觀察者的方法從頭創(chuàng)建一個(gè)ObservableEm...
    rkua閱讀 1,814評(píng)論 0 1
  • RxJava正在Android開(kāi)發(fā)者中變的越來(lái)越流行。唯一的問(wèn)題就是上手不容易孵班,尤其是大部分人之前都是使用命令式編...
    劉啟敏閱讀 1,849評(píng)論 1 7