Rxjava2學習筆記(一)

網上大佬們都整理得很好了,只是老看,總覺得差點啥,所以,就想着自己再捋一遍,加深印象。

給 Android 開發者的 RxJava 詳解

RxJava2.0——從放棄到入門

這可能是最好的RxJava 2.x 教程(完結版)

Android Rxjava:這是一篇 清晰 & 易懂的Rxjava 入門教程

首先要知道Rxjava2是幹嘛得?特點是啥?爲啥要用它?

Github:https://github.com/ReactiveX/RxJava

官方解釋:

RxJava – Reactive Extensions for the JVM – a library for composing asynchronous and event-based programs using observable sequences for the Java VM.

總結 :Rxjava是一個基於事件流、實現異步操作的庫。

作用:

實現異步操作,其作用效果和AndroidHandlerAsyncTask類似。

特點:

Rxjava的使用方式是: 基於事件流的鏈式調用,所以其特點:

  • 邏輯簡潔
  • 實現優雅
  • 使用簡單
  • 更重要的是,隨着程序邏輯複雜性提高,Rxjava依然能簡潔優雅。

核心思想:

Rxjava 其核心思想是 觀察者模式

例子1:A(連載小說) 可以看成被觀察者,B(讀者) 可以看成觀察者,其中B(讀者)訂閱了A(連載小說)後,一旦小說有更新就會推送給讀者,這樣B(讀者)就可以不用時時刻刻去盯着看A(連載小說)是否有更新,B(讀者)就可以花更多的事件去做其他事。

例子2:Android 中我們最常見的就是 Button的點擊事件,此時Button就是被觀察着,而OnClickListener()可以看成觀察者,它們之間通過setOnClickListener()完成訂閱關係,這樣,一旦Button被點擊,就會觸發監聽,通知

OnClickListener()

// buton 被觀察着
Button button = findViewById(R.id.bt);
// setOnClickListener()方法實現二者訂閱關係
button.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
    // 執行操作
    }
});

在Rxjava中,Observable就是被觀察者,Observer 爲觀察者,它們之間通過 subscribe 實現訂閱關係

正文

好了,前面說了一堆,現在可以擼起袖子開幹,先寫一個最簡單的Demo。

1、添加庫文件

implementation "io.reactivex.rxjava2:rxjava:2.2.2"

2、按照順序三部曲

(一)、初始化 Observable (被觀察者)

 Observable<String> observableString = Observable.create(new ObservableOnSubscribe<String>() {
            @Override
            public void subscribe(ObservableEmitter<String> emitter) throws Exception {
               Log.d(TAG, "Observable--subscribe: start");
                emitter.onNext("1");
                emitter.onNext("2");
                emitter.onNext("3");
                emitter.onComplete();
                LogUtil.d(TAG + "Observable--subscribe  stop");
            }
        });

Observable<T> 通過 create() 方法創建,其中泛型爲操作對象,與 ObservableOnSubscribe<T> 中對象一致,

ObservableOnSubscribe 可以理解爲計劃表,重寫 subscribe(ObservableEmitter<T> emitter) 方法 ,可通過emitter 進行發送消息,其主要有三個方法:

  • onNext(Object o)
  • onComplete()
  • onError(Throwable e)

三個方法分別對應了 Observer(觀察者) 中的 onNext()onComplete()onError()

注意點:

  • OnNext() 是可以多次調用的,onComplete()onError() 不能同時調用,會直接報錯。

  • onComplete() 可多次調用,但是 Observer 只接收其第一次,後面的不做處理。

  • onError() 只可以調用一次,調用第二次直接報錯。

(二)、初始化 Observer(觀察者)

Observer observer = new Observer<String>() {
          @Override
            public void onSubscribe(Disposable d) {
                Log.d(TAG, "Observer--onSubscribe: d=" + d.isDisposed());

            }

            @Override
            public void onNext(String s) {
                Log.d(TAG, "Observer--onNext: s=" + s);
            }

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

            @Override
            public void onComplete() {
                Log.d(TAG, "Observer--onComplete: ");
            }
        };

通過New直接創建Observer ,實現其方法,其中 onNext()onComplete()onError() 三個方法與 Observable 中 一一對應,前面發送,這裏對應接收。

特別說一下 onSubscribe(Disposable d) 中的 Disposable ,它有 isDisposed()dispose() 兩個方法,分別來判斷訂閱狀態及取消訂閱,此外這個方法,是最先進行調用的,等會後面會給出日誌。

(三)、訂閱

observableString.subscribe(observer);

按常理,應該是Observable(觀察者)訂閱Observer(被觀察者),但是Rxjava爲了滿足其鏈式調用,所以這裏給人感覺是被觀察者訂閱觀察者,這個不必在意,知道啥意思就行。

最後使用Rxjava的鏈式調用串起來:

Observable.create(new ObservableOnSubscribe<String>() {
    @Override
    public void subscribe(ObservableEmitter<String> emitter) throws Exception {
        Log.d(TAG, "Observable--subscribe: start");
        emitter.onNext("1");
        emitter.onNext("2");
        emitter.onNext("3");
        emitter.onComplete();
        LogUtil.d(TAG + "Observable--subscribe  stop");
    }
}).subscribe(new Observer<String>() {
    @Override
    public void onSubscribe(Disposable d) {
        Log.d(TAG, "Observer--onSubscribe: d=" + d.isDisposed());

    }

    @Override
    public void onNext(String s) {
        Log.d(TAG, "Observer--onNext: s=" + s);
    }

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

    @Override
    public void onComplete() {
        Log.d(TAG, "Observer--onComplete: ");
    }
});

上面就是一個最簡單的Rxjava的使用,日誌輸出 :

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章