Rxjava 基本使用 認(rèn)識(shí)RxJava

安卓小白一枚,剛開(kāi)始研究 RxJava铺遂,隨手記錄衫哥,過(guò)于基礎(chǔ)的內(nèi)容,新學(xué)習(xí)的小伙伴一起討論襟锐,大神輕拍撤逢,有不對(duì)的地方感謝指導(dǎo),立馬整改!

無(wú)聊的前篇

一直都知道有RxJava這么個(gè)東西蚊荣,也知道很好用初狰。但是手里的都是遺留下來(lái)的老項(xiàng)目,沒(méi)有用到互例,也沒(méi)有研究奢入,最近有點(diǎn)時(shí)間,趕緊惡補(bǔ)一下媳叨。

更無(wú)聊的基礎(chǔ)概念 :

  • 什么是RxJava腥光?(似乎只有我自己不知道--!!!)
    說(shuō)白了就是Rx 的 Java的實(shí)現(xiàn)。什么是Rx糊秆?就是 Reactive Extensions的縮寫(xiě)武福。Reactive Extensions又是什么呢?英語(yǔ)小白的我趕緊翻開(kāi)已經(jīng)落了一層厚厚的灰的《牛津高階英漢詞典》@┤弧(對(duì)艘儒,我什么方面都是小白!我超白7蚺肌)中文意思是 響應(yīng)式擴(kuò)展界睁。意思就是......emmmmm......
    我們看官方介紹吧(-
    -|||)
    什么是RxJava.png

好了,這里就應(yīng)該知道RxJava的概念了吧! (然而我是一臉懵 B~)

好吧, 概念解釋什么的官方說(shuō)的很官方~
各路大神也能夠給出特別好的介紹, 我這么白就不BB了!

上干貨!!!

RxJava的基礎(chǔ)實(shí)現(xiàn)

  • 配置 Android studio 的 gradle:
dependencies {
    ......
    implementation "io.reactivex.rxjava2:rxjava:2.2.3"
    implementation "io.reactivex.rxjava2:rxandroid:2.1.0"
}

RxAndroid: RxJava 在Android 平臺(tái)的擴(kuò)展, 里面有Android 相關(guān)的一些工具 .

  • 使用:
    最基本的需要3步:
  1. 創(chuàng)建觀察者(Observer)
  2. 創(chuàng)建被觀察者(Observable)
  3. 訂閱(Subscribe)
    有沒(méi)有很眼熟! 觀察者模式么不就是! 對(duì),就醬!

開(kāi)始操刀!!!!

1. 創(chuàng)建觀察者(Observer)

Observer<Object> observer = new Observer<Object>() {
            private Disposable disposable;// 用來(lái)解除訂閱

            @Override
            public void onSubscribe(Disposable d) {
                // 回調(diào)方法onSubscribe,傳遞參數(shù)為Disposable 兵拢,
                // Disposable相當(dāng)于RxJava1.x中的Subscription,用于解除訂閱
                disposable = d;
            }

            @Override
            public void onNext(Object o) {
                // TODO 觀察者普通事件翻斟,把要處理的事件添加到事件隊(duì)列中去
                Log.d(TAG, o.toString());
            }

            @Override
            public void onError(Throwable e) {
                // TODO 異常事件,當(dāng)發(fā)生異常時(shí)調(diào)用说铃,同時(shí)隊(duì)列終止访惜,不再發(fā)出事件
                Log.d(TAG, e.getMessage());
            }

            @Override
            public void onComplete() {
                // TODO 隊(duì)列事件結(jié)束,當(dāng)隊(duì)列中不再有新的事件產(chǎn)生時(shí)腻扇,觸發(fā)债热,作為結(jié)束標(biāo)志
                Log.d(TAG, "OnComplete");
            }
        };

其中有一個(gè)Disposable的對(duì)象,用來(lái)解除訂閱,只要在想要的位置添加

 disposable.dispose();

就可以了.

2. 創(chuàng)建被觀察者(Observable)

Observable observable = Observable.create(new ObservableOnSubscribe<Object>() {
            @Override
            public void subscribe(ObservableEmitter<Object> emitter) throws Exception {
                emitter.onNext("第一個(gè)數(shù)據(jù)");
                emitter.onNext("第二個(gè)數(shù)據(jù)");
                emitter.onComplete();
            }
        });

lambda一下:

Observable observable = Observable.create(emitter -> {
            emitter.onNext("第一個(gè)數(shù)據(jù)");
            emitter.onNext("第二個(gè)數(shù)據(jù)");
            emitter.onComplete();
        });

這是Observable.create() 添加事件, 還可以用just:

Observable observable1 = Observable.just("第一個(gè)數(shù)據(jù)", "第二個(gè)數(shù)據(jù)");

還可以用 fromArray :

 String[] words = {"第一個(gè)數(shù)據(jù)", "第二個(gè)數(shù)據(jù)"};
 Observable observable2 = Observable.fromArray(words);

你想要的,我都給你(^3^)

3. 訂閱(Subscribe)

這個(gè)只要一行代碼:

observable.subscribe(observer);

運(yùn)行結(jié)果:


輸出結(jié)果.png

結(jié)合

仔細(xì)看第三步訂閱,不就是 subscribe 把觀察者和被觀察者連在一起嗎.
有了這跟紅線,觀察者和被觀察者快(mei)樂(lè)(xiu)幸(mei)福(sao)的在一起后:

Observable.create(emitter ->{
            emitter.onNext("第一個(gè)數(shù)據(jù)");
            emitter.onNext("第二個(gè)數(shù)據(jù)");
            emitter.onComplete();
        }).subscribe(new Observer<Object>() {
            private Disposable disposable;// 用來(lái)解除訂閱

            @Override
            public void onSubscribe(Disposable d) {
                // 回調(diào)方法onSubscribe,傳遞參數(shù)為Disposable 幼苛,
                // Disposable相當(dāng)于RxJava1.x中的Subscription,用于解除訂閱
                disposable = d;
            }

            @Override
            public void onNext(Object o) {
                // TODO 觀察者普通事件窒篱,把要處理的事件添加到事件隊(duì)列中去
                Log.d(TAG, o.toString());
            }

            @Override
            public void onError(Throwable e) {
                // TODO 異常事件,當(dāng)發(fā)生異常時(shí)調(diào)用舶沿,同時(shí)隊(duì)列終止墙杯,不再發(fā)出事件
                Log.d(TAG, e.getMessage());
            }

            @Override
            public void onComplete() {
                // TODO 隊(duì)列事件結(jié)束,當(dāng)隊(duì)列中不再有新的事件產(chǎn)生時(shí)括荡,觸發(fā)高镐,作為結(jié)束標(biāo)志
                Log.d(TAG, "OnComplete");
            }
        });

好了圓滿了,就醬!!

然而

翻了資料看到還有一個(gè)問(wèn)題:
觀察者還有一種方式:

Subscriber<String> subscriber = new Subscriber<String>() {
            @Override
            public void onSubscribe(Subscription s) {
                //這一步是必須,我們通郴澹可以在這里做一些初始化操作嫉髓,調(diào)用request()方法表示初始化工作已經(jīng)完成
                //調(diào)用request()方法观腊,會(huì)立即觸發(fā)onNext()方法
                s.request(Long.MAX_VALUE);//這里是請(qǐng)求數(shù)量,如果沒(méi)有要求可以寫(xiě)Long.MAX_VALUE算行,請(qǐng)求足夠多的事件
                //在onComplete()方法完成恕沫,才會(huì)再執(zhí)行request()后邊的代碼
            }

            @Override
            public void onNext(String s) {
                // TODO 觀察者普通事件,把要處理的事件添加到事件隊(duì)列中去
                Log.d(TAG, s);
            }

            @Override
            public void onError(Throwable t) {
                // TODO 異常事件纱意,當(dāng)發(fā)生異常時(shí)調(diào)用,同時(shí)隊(duì)列終止鲸阔,不再發(fā)出事件
                Log.d(TAG, t.getMessage());
            }

            @Override
            public void onComplete() {
                // TODO 隊(duì)列事件結(jié)束偷霉,當(dāng)隊(duì)列中不再有新的事件產(chǎn)生時(shí),觸發(fā)褐筛,作為結(jié)束標(biāo)志
                Log.d(TAG, "OnComplete");
            }
        };

同樣的訂閱:

observable.subscribe(subscriber);

然后就


報(bào)錯(cuò).png

subscribe.png

沒(méi)有Subscriber 對(duì)象,說(shuō)好了做彼此的好基友呢?為啥不要我了!!


你變了.jpg

但是有的時(shí)候變的往往是我們自己

上源碼大法!
RxJava 1.0

public abstract class Subscriber<T> implements Observer<T>, Subscription {...}

RxJava 2.0

public interface Subscriber<T> {...}

RxJava 2.0 已經(jīng)按照Reactive-Streams specification規(guī)范完全的重寫(xiě)了类少。RxJava2.0 已經(jīng)獨(dú)立于RxJava 1.x而存在。還想著向下兼容的好事兒呢?!呵呵~~~
那么我Subscriber 就孤獨(dú)沒(méi)人要了嗎?當(dāng)讓不是.
在RxJava2.0中增加被觀察者的新實(shí)現(xiàn):Flowable 而且支持背壓呀有木有!
具體的使用和 Observable Observer的組合基本一樣:

        //觀察者
        ResourceSubscriber<String> subscriber = new ResourceSubscriber<String>() {
            @Override
            public void onStart() {
                request(Long.MAX_VALUE);//這里是請(qǐng)求數(shù)量渔扎,如果沒(méi)有要求可以寫(xiě)Long.MAX_VALUE,請(qǐng)求足夠多的事件
            }

            @Override
            public void onNext(String s) {
                // TODO 觀察者普通事件晃痴,把要處理的事件添加到事件隊(duì)列中去
                Log.d(TAG, s);
            }

            @Override
            public void onError(Throwable t) {
                // TODO 異常事件残吩,當(dāng)發(fā)生異常時(shí)調(diào)用,同時(shí)隊(duì)列終止倘核,不再發(fā)出事件
                Log.d(TAG, t.getMessage());
            }

            @Override
            public void onComplete() {
                // TODO 隊(duì)列事件結(jié)束泣侮,當(dāng)隊(duì)列中不再有新的事件產(chǎn)生時(shí),觸發(fā)紧唱,作為結(jié)束標(biāo)志
                Log.d(TAG, "OnComplete");
            }
        };
        
        //可觀察者活尊,和被觀察者一樣的
        Flowable flowable = Flowable.create((FlowableOnSubscribe<String>) emitter -> {
            emitter.onNext("第一個(gè)數(shù)據(jù)");
            emitter.onNext("第二個(gè)數(shù)據(jù)");
            emitter.onComplete();
        }, BackpressureStrategy.BUFFER);// 多了一個(gè)參數(shù)

        //訂閱
        flowable.subscribe(subscriber);
        //取消訂閱
        subscriber.dispose();

然后看一眼ResourceSubscriber是啥:

public abstract class ResourceSubscriber<T> implements FlowableSubscriber<T>, Disposable {....}

再看一眼FlowableSubscriber :

public interface FlowableSubscriber<T> extends SubscSriber<T> {...}

看到?jīng)]! 我Subscriber! 穿上美麗的裙子,變成了ResourceSubscriber!!!嫁給了王子!!!(總覺(jué)得哪里不對(duì)...Observable 和 SubscSriber是曾經(jīng)的基友...穿裙子...嫁給王子...)理不清了,不管了!

只是想說(shuō)一句,現(xiàn)在的搜索引擎...emmmm...優(yōu)秀!!!!
上面就是最基本的RxJava的使用了,后續(xù)再學(xué)習(xí)再更新!!!

(某大神: 這么簡(jiǎn)單的東西也要寫(xiě)hetui~)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市漏益,隨后出現(xiàn)的幾起案子蛹锰,更是在濱河造成了極大的恐慌,老刑警劉巖绰疤,帶你破解...
    沈念sama閱讀 216,402評(píng)論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件铜犬,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡峦睡,警方通過(guò)查閱死者的電腦和手機(jī)翎苫,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)榨了,“玉大人煎谍,你說(shuō)我怎么就攤上這事×耄” “怎么了呐粘?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,483評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵满俗,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我作岖,道長(zhǎng)唆垃,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,165評(píng)論 1 292
  • 正文 為了忘掉前任痘儡,我火速辦了婚禮辕万,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘沉删。我一直安慰自己渐尿,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,176評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布矾瑰。 她就那樣靜靜地躺著砖茸,像睡著了一般。 火紅的嫁衣襯著肌膚如雪殴穴。 梳的紋絲不亂的頭發(fā)上凉夯,一...
    開(kāi)封第一講書(shū)人閱讀 51,146評(píng)論 1 297
  • 那天采幌,我揣著相機(jī)與錄音,去河邊找鬼再沧。 笑死尊残,一個(gè)胖子當(dāng)著我的面吹牛寝衫,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播隘截,決...
    沈念sama閱讀 40,032評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼婶芭,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼犀农!你這毒婦竟也來(lái)了宰掉?” 一聲冷哼從身側(cè)響起赁濒,我...
    開(kāi)封第一講書(shū)人閱讀 38,896評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤拒炎,失蹤者是張志新(化名)和其女友劉穎击你,沒(méi)想到半個(gè)月后谎柄,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,311評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,536評(píng)論 2 332
  • 正文 我和宋清朗相戀三年捍歪,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了鸵钝。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,696評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖怠堪,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情凰棉,我是刑警寧澤陌粹,帶...
    沈念sama閱讀 35,413評(píng)論 5 343
  • 正文 年R本政府宣布掏秩,位于F島的核電站,受9級(jí)特大地震影響映凳,放射性物質(zhì)發(fā)生泄漏杆煞。R本人自食惡果不足惜腐泻,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,008評(píng)論 3 325
  • 文/蒙蒙 一派桩、第九天 我趴在偏房一處隱蔽的房頂上張望铆惑。 院中可真熱鬧送膳,春花似錦、人聲如沸撕阎。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至汗侵,卻和暖如春晰韵,著一層夾襖步出監(jiān)牢的瞬間熟妓,已是汗流浹背滑蚯。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,815評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留坤次,地道東北人斥赋。 一個(gè)月前我還...
    沈念sama閱讀 47,698評(píng)論 2 368
  • 正文 我出身青樓疤剑,卻偏偏與公主長(zhǎng)得像闷堡,于是被迫代替她去往敵國(guó)和親杠览。 傳聞我的和親對(duì)象是個(gè)殘疾皇子纵势,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,592評(píng)論 2 353

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