Rxjava源碼解析筆記 | Rxjava基本用法詳析(附示例代碼)

Rxjava四要素

  1. 被觀察者
    在Rxjava當(dāng)中,
    決定什么時(shí)候觸發(fā)事件,
    決定觸發(fā)什么樣的事件;

  2. 觀察者

    • 決定事件觸發(fā)的時(shí)候?qū)a(chǎn)生什么樣的行為;

    • 類似于傳統(tǒng)觀察者模式
      觀察者會(huì)隨著被觀察者的狀態(tài)變化而發(fā)生相應(yīng)的操作;

  3. 訂閱

    • 區(qū)別于傳統(tǒng)觀察者模式;

    • 觀察者被觀察者需要通過訂閱來聯(lián)系;

    • 通過subscribe()方法完成這個(gè)訂閱關(guān)系;

    • 完成訂閱關(guān)系后,
      即可令被觀察者(Observable)在需要的時(shí)候,
      發(fā)出事件來通知觀察者(Observer)

  4. 事件

    • 區(qū)別于傳統(tǒng)觀察者模式;
      (下面詳說)

事件

  • 響應(yīng)式編程中的核心概念;
  • 響應(yīng)式編程乃基于異步數(shù)據(jù)流概念的編程模式;
理解響應(yīng)式編程
  • 場(chǎng)景舉例:客戶端服務(wù)端獲取到最新的數(shù)據(jù)時(shí),
    需要通知客戶端本身相關(guān)模塊進(jìn)行更新(如UI變換顯示等);
    這其實(shí)便是一種響應(yīng)式編程——
    客戶端根據(jù)服務(wù)端的變化做出相應(yīng);
生活中的例子
  • 天氣冷了我們就要多穿件衣服。
    天氣冷了,就是一種事件;
    要多穿件衣服,就是基于事件做出響應(yīng);
  • 餓了要吃飯。
    餓了,就是一種事件;
    吃飯,就是基于事件做出響應(yīng);

代碼分析

  • 第一步,
    (通過create())創(chuàng)建被觀察者(Observable),即第一個(gè)基本要素,
    其中注意OnSubscribe<String>()對(duì)象,
    記住它是存儲(chǔ)在Observable當(dāng)中的;
    當(dāng)Observable訂閱之后,
    它會(huì)啟動(dòng)OnSubscribe<String>()對(duì)象中的回調(diào)方法call(),
    同時(shí)運(yùn)行call()方法體中寫好的反應(yīng)序列
    //第一步:創(chuàng)建被觀察者:create
    Observable observable = Observable.create(new Observable.OnSubscribe<String>() {
        @Override
        public void call(Subscriber<? super String> subscriber) {
            subscriber.onNext("Hello");
            subscriber.onNext("Imooc");
            subscriber.onCompleted();
        }
    });
  • .

    • 其中,其實(shí)Subscriber就是我們的觀察者;
      后面的Rxjava源碼閱讀中,
      我們會(huì)發(fā)現(xiàn)Observer在源碼中也會(huì)被轉(zhuǎn)換成Subscriber來進(jìn)行相應(yīng)的處理,
      所有才說其實(shí)Subscriber就是我們的觀察者;

    • 以上我們可以看到,在create一個(gè)被觀察者時(shí),
      我們new了一個(gè)OnSubscribe<String>()
      并在其中實(shí)現(xiàn)了回調(diào)方法call(),
      回調(diào)方法中調(diào)用了觀察者的方法——
      在創(chuàng)建被觀察者時(shí),使用了調(diào)用了觀察者方法回調(diào)方法,
      這其實(shí)就是一種事件的傳遞
      最后將這個(gè)OnSubscribe<String>()賦給被觀察者的創(chuàng)建方法create();
      如此便跟傳統(tǒng)觀察者模式聯(lián)系起來了;
      (只不過這里Rxjava給我們做好了更好的封裝)

  • 以上是創(chuàng)建被觀察者的一種方法,
    事實(shí)上還有其他兩種

    • 第二種,通過just()方法創(chuàng)建,
      只要把參數(shù)放到just()方法中,以逗號(hào)分隔開來即可,
      just()其實(shí)就是將參數(shù) 依次通過事件 發(fā)送出來,
      這種寫法其實(shí)是跟上面的兩個(gè)onNext()、一個(gè)onCompleted()的寫法是一樣的;

    • 第三種,通過from()方法,
      類似于第二種方法,只是把傳給just參數(shù)組合成一個(gè)String數(shù)組在傳給from();
      這種寫法其實(shí)是跟上面的兩個(gè)onNext()、一個(gè)onCompleted()的寫法是一樣的;

  • 以上三種方法其實(shí)都是等價(jià)的,其最終目的都是創(chuàng)建被觀察者;

    //通過just方法來創(chuàng)建被觀察者
    Observable observableJust = Observable.just("hello", "Imooc");

    //通過from方法來創(chuàng)建被觀察者
    String[] parameters = {"hello", "Imooc"};
    Observable observableFrom = Observable.from(parameters);
  • 第二步,
    創(chuàng)建觀察者Observer/Subscriber,即第二個(gè)要素,
    1.在傳統(tǒng)的觀察者模式當(dāng)中,觀察者只有一個(gè)update()方法,
    在其中根據(jù)被觀察者狀態(tài)變化而做出反應(yīng)/改變;
    1. 而在Rxjava中,框架給出了三個(gè)方法;
      其中onCompleted()onError()兩個(gè)方法就是對(duì)傳統(tǒng)觀察者模式做出的改變/區(qū)別,
      onNext()其實(shí)就是傳統(tǒng)觀察者模式當(dāng)中的update();
    • onCompleted():當(dāng)不再有新的事件通過被觀察者 發(fā)出的時(shí)候回調(diào);
    • onError(): 在處理異??蚣軙r(shí)回調(diào)
    • onNext():同理傳統(tǒng)觀察者模式當(dāng)中的update(),
      即編寫 當(dāng)被觀察者發(fā)生狀態(tài)改變時(shí),觀察者的處理邏輯;
   //第二步:創(chuàng)建觀察者
    Observer<Object> observer = new Observer<Object>() {

        @Override
        public void onCompleted() {

        }

        @Override
        public void onError(Throwable e) {

        }

        @Override
        public void onNext(Object s) {

        }
    };
  • 被觀察者Observable是用過鏈?zhǔn)秸{(diào)用來執(zhí)行的;
    為的是讓后面的操作符、線程控制等能夠跟流式OPI來完善,
    而不是其他方式觀察者去訂閱被觀察者(非鏈?zhǔn)剑?/code>——
    這樣從意思上容易理解,但在API調(diào)用上很不方便;
  • 鏈?zhǔn)秸{(diào)用:理解比較繞,但能跟流式OPI來完善,API調(diào)用上非常方便;
  • 非鏈?zhǔn)秸{(diào)用:意思上容易理解,但在API調(diào)用上很不方便;
  • 第三步,訂閱:
    前面我們說概念的時(shí)候,都是觀察者訂閱被觀察者的,
    可是這里代碼中,
    “奇怪”的是“被觀察者(Observable)訂閱(subscribe)觀察者(Observer)”,
    這里就是上面說的,
    為了后面能夠通過流式OPI,
    使進(jìn)行操作符、線程控制等操作時(shí)能夠通過鏈?zhǔn)秸{(diào)用來完善;

    所以這里Rxjava中把訂閱設(shè)計(jì)成“被觀察者(Observable)去訂閱(subscribe)觀察者(Observer)”
    public void doRxjava(){
        //第三步:訂閱
        observable.subscribe(observer);
    }
  • 本節(jié)完整代碼如下:

這里其實(shí)只是Rxjava的一種簡(jiǎn)單的使用,
主要是理解一下Rxjava對(duì)傳統(tǒng)觀察者設(shè)計(jì)模式拓展改進(jìn);

實(shí)際情況當(dāng)中,其實(shí)它還包括了很多操作符,
以及Rxjava最核心的線程控制調(diào)度,
這兩部分是Rxjava的核心.

package com.example.jiajiemu.a11.rxjava;

import rx.Observable;
import rx.Observer;
import rx.Subscriber;

/**
 * Created by Mjj on 2017/10/6.
 */

public class RxjavaCreateDemo {

    //第一步:創(chuàng)建被觀察者:create
    Observable observable = Observable.create(new Observable.OnSubscribe<String>() {
        @Override
        public void call(Subscriber<? super String> subscriber) {
            subscriber.onNext("Hello");
            subscriber.onNext("Imooc");
            subscriber.onCompleted();
        }
    });

    //通過just方法來創(chuàng)建被觀察者
    Observable observableJust = Observable.just("hello", "Imooc");

    //通過from方法來創(chuàng)建被觀察者
    String[] parameters = {"hello", "Imooc"};
    Observable observableFrom = Observable.from(parameters);

    //第二步:創(chuàng)建觀察者
    Observer<Object> observer = new Observer<Object>() {

        @Override
        public void onCompleted() {

        }

        @Override
        public void onError(Throwable e) {

        }

        @Override
        public void onNext(Object s) {

        }
    };

    public void doRxjava(){
        //第三步:訂閱
        observable.subscribe(observer);
    }

}






參考自 慕課網(wǎng)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容