RxJava2學(xué)習(xí)筆記1

RxJava用了一年多凹炸,一直cv,沒(méi)仔細(xì)的去學(xué)習(xí)過(guò)懒熙。拖到rxjava2都出來(lái)了丘损,所以今年的遺愿清單里加上學(xué)習(xí)rxjava2,半年過(guò)去了工扎,做下筆記徘钥。
新建了一個(gè)javalib的module,添加rxjava的依賴肢娘。

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

寫(xiě)一個(gè)Observable呈础,然后subscribe舆驶,發(fā)現(xiàn)多了很多的訂閱者。


image.png

先試簡(jiǎn)單的猪落,

        Observable.create(new ObservableOnSubscribe<Integer>() {
            @Override
            public void subscribe(@NonNull ObservableEmitter<Integer> e) throws Exception {
                 System.out.println("subscribe");             
                 e.onNext(1);
           
            }
        }).subscribe(new Consumer<Integer>() {
            @Override
            public void accept(@NonNull Integer integer) throws Exception {
                System.out.println("accept="+integer);
            }
        });
image.png

和rxjava1如出一轍贞远。

訂閱者只有一個(gè)方法,那如果發(fā)射異常呢笨忌?

    Observable.create(new ObservableOnSubscribe<Integer>() {
        @Override
        public void subscribe(@NonNull ObservableEmitter<Integer> e) throws Exception {
            System.out.println("發(fā)射1");
            e.onNext(1);
            System.out.println("發(fā)射異常");
            e.onError(new Throwable("我是異常"));
            System.out.println("發(fā)射異常后");
        }
    }).subscribe(new Consumer<Integer>() {
        @Override
        public void accept(@NonNull Integer integer) throws Exception {
            System.out.println("accept="+integer);
        }
    });

結(jié)果就報(bào)異常了蓝仲。accept方法并沒(méi)有走。so官疲,如果只關(guān)心onNext袱结,可以這樣寫(xiě),但是途凫,我們實(shí)際工作種要考慮異常情況垢夹。那么

 Observable.create(new ObservableOnSubscribe<Integer>() {
            @Override
            public void subscribe(@NonNull ObservableEmitter<Integer> e) throws Exception {
                System.out.println("發(fā)射1");
                e.onNext(1);
                System.out.println("發(fā)射異常");
                e.onError(new Throwable("我是異常"));
                System.out.println("發(fā)射異常后");
            }
        }).subscribe(new Observer<Integer>() {
            @Override
            public void onSubscribe(@NonNull Disposable d) {
                System.out.println("onSubscribe");
            }

            @Override
            public void onNext(@NonNull Integer integer) {
                System.out.println("onNext" + integer);
            }

            @Override
            public void onError(@NonNull Throwable e) {
                System.out.println("onError");
            }

            @Override
            public void onComplete() {
                System.out.println("onComplete");
            }
        });
---------------------------------------------
onSubscribe
發(fā)射1
onNext1
發(fā)射異常
onError
發(fā)射異常后

這些生產(chǎn)者和消費(fèi)者都是再主線程的,如果在Android里生產(chǎn)數(shù)據(jù)超時(shí),就引起ANR,那么試一下線程調(diào)度:

        Observable.create(new ObservableOnSubscribe<Integer>() {
            @Override
            public void subscribe(@NonNull ObservableEmitter<Integer> e) throws Exception {
                System.out.println("shot1==thread=="+Thread.currentThread().getName());
                e.onNext(1);

                System.out.println("shot==thread=="+Thread.currentThread().getName());
                e.onError(new Throwable("shoterror"));
                System.out.println("aftershoterror==thread=="+Thread.currentThread().getName());
            }
        }).subscribeOn(Schedulers.io()).subscribe(new Observer<Integer>() {
            @Override
            public void onSubscribe(@NonNull Disposable d) {
                System.out.println("onSubscribe==thread=="+Thread.currentThread().getName());
            }

            @Override
            public void onNext(@NonNull Integer integer) {
                System.out.println("onNext" + integer+"==thread=="+Thread.currentThread().getName());
            }

            @Override
            public void onError(@NonNull Throwable e) {
                System.out.println("onError==thread=="+Thread.currentThread().getName());
            }

            @Override
            public void onComplete() {
                System.out.println("onComplete"+Thread.currentThread().getName());
            }
        });

        System.out.println("aaaaaaaaaaa==thread==" +Thread.currentThread().getName());

image.png

.subscribeOn(Schedulers.io())后维费,生產(chǎn)消費(fèi)都在io線程果元。

  @Override
            public void onSubscribe(@NonNull Disposable d) {
                System.out.println("onSubscribe==thread=="+Thread.currentThread().getName());
            }

這個(gè)方法是在main線程,因?yàn)檫@個(gè)是在訂閱前的線程犀盟,就是 Observable.create的時(shí)候的線程而晒。

 Observable.create(new ObservableOnSubscribe<Integer>() {
            @Override
            public void subscribe(@NonNull ObservableEmitter<Integer> e) throws Exception {
                System.out.println("shot1==thread==" + Thread.currentThread().getName());
                e.onNext(1);

                System.out.println("shot==thread==" + Thread.currentThread().getName());
                e.onError(new Throwable("shoterror"));
                System.out.println("aftershoterror==thread==" + Thread.currentThread().getName());
            }
        }).subscribeOn(Schedulers.io())
                .subscribeOn(Schedulers.io()).subscribe(new Observer<Integer>() {
            @Override
            public void onSubscribe(@NonNull Disposable d) {
                System.out.println("onSubscribe==thread==" + Thread.currentThread().getName());
            }

            @Override
            public void onNext(@NonNull Integer integer) {
                System.out.println("onNext" + integer + "==thread==" + Thread.currentThread().getName());
            }

            @Override
            public void onError(@NonNull Throwable e) {
                System.out.println("onError==thread==" + Thread.currentThread().getName());
            }

            @Override
            public void onComplete() {
                System.out.println("onComplete" + Thread.currentThread().getName());
            }
        });

        System.out.println("aaaaaaaaaaa==thread==" + Thread.currentThread().getName());

如果我.subscribeOn(Schedulers.io())變換2次線程,結(jié)果還是第一次的線程阅畴。

image.png

)

   Observable.create(new ObservableOnSubscribe<Integer>() {
            @Override
            public void subscribe(@NonNull ObservableEmitter<Integer> e) throws Exception {
                System.out.println("發(fā)射1==thread==" + Thread.currentThread().getName());
                e.onNext(1);
                System.out.println("發(fā)射2==thread==" + Thread.currentThread().getName());
                e.onNext(2);
                System.out.println("發(fā)射error==thread==" + Thread.currentThread().getName());
//                e.onError(new Throwable("shoterror"));
                System.out.println("發(fā)射error后==thread==" + Thread.currentThread().getName());
            }
        }).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Observer<Integer>() {
                    @Override
                    public void onSubscribe(@NonNull Disposable d) {
                        System.out.println("onSubscribe==thread==" + Thread.currentThread().getName());
                    }

                    @Override
                    public void onNext(@NonNull Integer integer) {
                        System.out.println("onNext" + integer + "==thread==" + Thread.currentThread().getName());
                    }

                    @Override
                    public void onError(@NonNull Throwable e) {
                        System.out.println("onError==thread==" + Thread.currentThread().getName());
                    }

                    @Override
                    public void onComplete() {
                        System.out.println("onComplete" + Thread.currentThread().getName());
                    }
                });

.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread())倡怎,subscribeOn是生產(chǎn)發(fā)射的線程,observeOn決定的是接收消費(fèi)的線程贱枣。

image.png

如果生產(chǎn)2個(gè)數(shù)據(jù)监署,打印出來(lái)是2個(gè)都發(fā)射后才消費(fèi)。順序是這樣的嗎纽哥?驗(yàn)證:

   Observable.create(new ObservableOnSubscribe<Integer>() {
            @Override
            public void subscribe(@NonNull ObservableEmitter<Integer> e) throws Exception {
                for (int i = 0; i <1000 ; i++) {
                    System.out.println(i+"要發(fā)射==thread==" + Thread.currentThread().getName());
                    e.onNext(i);

                }
            }
        })
image.png

確實(shí)如此钠乏,全部數(shù)據(jù)發(fā)射完后才接受,那么去掉線程調(diào)度呢

image.png

生產(chǎn)一個(gè)消費(fèi)一個(gè)春塌。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末晓避,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子摔笤,更是在濱河造成了極大的恐慌够滑,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,277評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件吕世,死亡現(xiàn)場(chǎng)離奇詭異彰触,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)命辖,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門(mén)况毅,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)分蓖,“玉大人,你說(shuō)我怎么就攤上這事尔许∶春祝” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 163,624評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵味廊,是天一觀的道長(zhǎng)蒸甜。 經(jīng)常有香客問(wèn)我,道長(zhǎng)余佛,這世上最難降的妖魔是什么柠新? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,356評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮辉巡,結(jié)果婚禮上恨憎,老公的妹妹穿的比我還像新娘。我一直安慰自己郊楣,他們只是感情好憔恳,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著净蚤,像睡著了一般钥组。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上塞栅,一...
    開(kāi)封第一講書(shū)人閱讀 51,292評(píng)論 1 301
  • 那天者铜,我揣著相機(jī)與錄音腔丧,去河邊找鬼放椰。 笑死,一個(gè)胖子當(dāng)著我的面吹牛愉粤,可吹牛的內(nèi)容都是我干的砾医。 我是一名探鬼主播,決...
    沈念sama閱讀 40,135評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼衣厘,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼如蚜!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起影暴,我...
    開(kāi)封第一講書(shū)人閱讀 38,992評(píng)論 0 275
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤错邦,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后型宙,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體撬呢,經(jīng)...
    沈念sama閱讀 45,429評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評(píng)論 3 334
  • 正文 我和宋清朗相戀三年妆兑,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了魂拦。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片毛仪。...
    茶點(diǎn)故事閱讀 39,785評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖芯勘,靈堂內(nèi)的尸體忽然破棺而出箱靴,到底是詐尸還是另有隱情,我是刑警寧澤荷愕,帶...
    沈念sama閱讀 35,492評(píng)論 5 345
  • 正文 年R本政府宣布衡怀,位于F島的核電站,受9級(jí)特大地震影響安疗,放射性物質(zhì)發(fā)生泄漏狈癞。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評(píng)論 3 328
  • 文/蒙蒙 一茂契、第九天 我趴在偏房一處隱蔽的房頂上張望蝶桶。 院中可真熱鬧,春花似錦掉冶、人聲如沸真竖。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,723評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)恢共。三九已至,卻和暖如春璧亚,著一層夾襖步出監(jiān)牢的瞬間讨韭,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,858評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工癣蟋, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留透硝,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,891評(píng)論 2 370
  • 正文 我出身青樓疯搅,卻偏偏與公主長(zhǎng)得像濒生,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子幔欧,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評(píng)論 2 354

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