Rxjava2學(xué)習(xí)筆記一:RxJava2基本使用

參考鏈接:
http://www.reibang.com/p/464fa025229e
Rxjava2學(xué)習(xí)筆記二:RxJava2進(jìn)階使用-zip操作符
http://www.reibang.com/p/ef8b620fdc4c
Rxjava2學(xué)習(xí)筆記三:RxJava2進(jìn)階使用-map操作符
http://www.reibang.com/p/f7efc1aeb6c9

1.Gradle配置

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

2.原理

  • 先假設(shè)2根水管:
    Alt text
  • 上面一根水管為事件產(chǎn)生的水管辛藻,叫它上游吧,下面一根水管為事件接收的水管叫它下游吧
  • 兩根水管通過某種方式連接在一起:使得上游每產(chǎn)生一個(gè)事件食棕,下游都能收到該事件
    上游事件產(chǎn)生順序:1->2->3;下游事件接收順序:1->2->3

基本使用例1

    注:Rxjava2中的emitter-》發(fā)射器,用于被觀察者發(fā)射事件  
    Disposable-》RxJava1.x中的Subscription,用于解除訂閱

    //創(chuàng)建一個(gè)上游 Observable:
    Observable<Integer> observable = Observable.create(new ObservableOnSubscribe<Integer>() {
        @Override
        public void subscribe(ObservableEmitter<Integer> emitter) throws Exception {
            emitter.onNext(1);
            emitter.onNext(2);
            emitter.onNext(3);
            emitter.onComplete();
        }
    });
    //創(chuàng)建一個(gè)下游 Observer
    Observer<Integer> observer = new Observer<Integer>() {
        @Override
        public void onSubscribe(Disposable d) {
            Log.d(TAG, "subscribe");
        }

        @Override
        public void onNext(Integer value) {
            Log.d(TAG, "" + value);
        }

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

        @Override
        public void onComplete() {
            Log.d(TAG, "complete");
        }
    };
    //建立連接
    observable.subscribe(observer);

基本使用例2-鏈?zhǔn)秸{(diào)用

    Observable.create(new ObservableOnSubscribe<Integer>() {
        @Override
        public void subscribe(ObservableEmitter<Integer> emitter) throws Exception {
            emitter.onNext(1);
            emitter.onNext(2);
            emitter.onNext(3);
            emitter.onComplete();
        }
    }).subscribe(new Observer<Integer>() {
        @Override
        public void onSubscribe(Disposable d) {
            Log.d(TAG, "subscribe");
        }

        @Override
        public void onNext(Integer value) {
            Log.d(TAG, "" + value);
        }

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

        @Override
        public void onComplete() {
            Log.d(TAG, "complete");
        }
    });
  • 注:ObservableEmitter[發(fā)射器]:發(fā)出事件
    ->調(diào)用emitter的onNext(T value)琢岩、onComplete()和onError(Throwable error)
    ->發(fā)出next事件、complete事件和error事件

Emitter-發(fā)送規(guī)則

  • 1.上游可以發(fā)送無限個(gè)onNext, 下游也可以接收無限個(gè)onNext.
  • 2.當(dāng)上游發(fā)送了一個(gè)onComplete后, 上游onComplete之后的事件將會(huì)繼續(xù)發(fā)送,
    而下游收到onComplete事件之后將不再繼續(xù)接收事件.
  • 3.當(dāng)上游發(fā)送了一個(gè)onError后, 上游onError之后的事件將繼續(xù)發(fā)送, 而下游收到onError事件之后將不再繼續(xù)接收事件.
  • 4.上游可以不發(fā)送onComplete或onError.
  • 5.最為關(guān)鍵的是onComplete和onError必須唯一并且互斥, 即不能發(fā)多個(gè)onComplete, 也不能發(fā)多個(gè)onError, 也不能先發(fā)一個(gè)onComplete, 然后再發(fā)一個(gè)onError, 反之亦然

發(fā)送規(guī)則示意圖
1.發(fā)送onNext()事件

Alt text

2.發(fā)送onComplete()事件
Alt text

3.發(fā)送發(fā)送onError事件事件
Alt text

Disposable-訂閱

  • 1.相當(dāng)于RxJava1.x中的Subscription,用于解除訂閱

  • 2.解除訂閱:disposable.dispose();

  • 3.多個(gè)Disposable時(shí)取消訂閱,RxJava中已經(jīng)內(nèi)置了一個(gè)容器CompositeDisposable,每當(dāng)我們得到一個(gè)Disposable時(shí)就調(diào)用CompositeDisposable.add()將它添加到容器中, 在退出的時(shí)候, 調(diào)用CompositeDisposable.clear() 即可切斷所有的水管.

  • 4.eg:

    Disposable disposable = observable.subscribe(new Consumer<Integer>() {
              @Override
              public void accept(Integer integer) throws Exception {
                    //這里接收數(shù)據(jù)項(xiàng)
              }
          }, new Consumer<Throwable>() {
              @Override
              public void accept(Throwable throwable) throws Exception {
                //這里接收onError
              }
          }, new Action() {
              @Override
              public void run() throws Exception {
                //這里接收onComplete间狂。
              }
          });
      disposable.dispose();//解除訂閱
    

Consumer-消費(fèi)者

  • 1.用于接收單個(gè)值暂吉,其他的如:BiConsumer則是接收兩個(gè)值陆蟆,F(xiàn)unction用于變換對(duì)象字支,Predicate用于判斷用法如上的例子
  • 2.替代了RxJava1.x中的Action/Func接口

3.Rxjava線程調(diào)度

  • 1 subscribeOn(Schedulers.io())//上游發(fā)送事件的線程,第一次有效(如網(wǎng)絡(luò)請(qǐng)求可在IO或子線程發(fā)送事件)
    observeOn(AndroidSchedulers.mainThread())//下游接收事件的線程(主線程接收返回信息后更新UI)
    observeOn(Schedulers.io())//線程切換凤藏;可多次切換每調(diào)用一次observeOn() , 下游的線程就會(huì)切換一次.
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市堕伪,隨后出現(xiàn)的幾起案子揖庄,更是在濱河造成了極大的恐慌,老刑警劉巖欠雌,帶你破解...
    沈念sama閱讀 216,496評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蹄梢,死亡現(xiàn)場離奇詭異,居然都是意外死亡富俄,警方通過查閱死者的電腦和手機(jī)禁炒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來霍比,“玉大人幕袱,你說我怎么就攤上這事∮扑玻” “怎么了凹蜂?”我有些...
    開封第一講書人閱讀 162,632評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長阁危。 經(jīng)常有香客問我玛痊,道長,這世上最難降的妖魔是什么狂打? 我笑而不...
    開封第一講書人閱讀 58,180評(píng)論 1 292
  • 正文 為了忘掉前任擂煞,我火速辦了婚禮,結(jié)果婚禮上趴乡,老公的妹妹穿的比我還像新娘对省。我一直安慰自己,他們只是感情好晾捏,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,198評(píng)論 6 388
  • 文/花漫 我一把揭開白布蒿涎。 她就那樣靜靜地躺著,像睡著了一般惦辛。 火紅的嫁衣襯著肌膚如雪劳秋。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,165評(píng)論 1 299
  • 那天胖齐,我揣著相機(jī)與錄音玻淑,去河邊找鬼。 笑死呀伙,一個(gè)胖子當(dāng)著我的面吹牛补履,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播剿另,決...
    沈念sama閱讀 40,052評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼箫锤,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼!你這毒婦竟也來了雨女?” 一聲冷哼從身側(cè)響起谚攒,我...
    開封第一講書人閱讀 38,910評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎戚篙,沒想到半個(gè)月后五鲫,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,324評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡岔擂,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,542評(píng)論 2 332
  • 正文 我和宋清朗相戀三年位喂,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片乱灵。...
    茶點(diǎn)故事閱讀 39,711評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡塑崖,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出痛倚,到底是詐尸還是另有隱情规婆,我是刑警寧澤,帶...
    沈念sama閱讀 35,424評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站抒蚜,受9級(jí)特大地震影響掘鄙,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜嗡髓,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,017評(píng)論 3 326
  • 文/蒙蒙 一操漠、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧饿这,春花似錦浊伙、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至串结,卻和暖如春哑子,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背奉芦。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評(píng)論 1 269
  • 我被黑心中介騙來泰國打工赵抢, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人声功。 一個(gè)月前我還...
    沈念sama閱讀 47,722評(píng)論 2 368
  • 正文 我出身青樓烦却,卻偏偏與公主長得像,于是被迫代替她去往敵國和親先巴。 傳聞我的和親對(duì)象是個(gè)殘疾皇子其爵,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,611評(píng)論 2 353