1章 基礎概念

Hensen發表於2019-05-13

本篇文章已授權微信公眾號 YYGeeker 獨家釋出轉載請標明出處

CSDN學院課程地址

1. 基礎概念

1.1 RxJava簡述

  • 用原話說:RxJava是一個在Java虛擬機器上,使用可觀察的序列構成基於事件的,非同步的程式庫
  • 用白話說:類似於Google提供給我們使用的AsyncTask,它能在非同步執行緒處理後傳遞到UI執行緒中處理

1.2 RxAndroid簡述

  • 用原話說:RxAndroid是基於RxJava開發出的一套適用於Android開發的輔助庫
  • 用白話說:RxJava通過RxAndroid的輔助,使得原本RxJava只在Java上執行的程式也能在Android上開發

1.3 設計模式中的觀察者模式

觀察者模式就是RxJava使用的核心點,掌握這個模式,可以理解RxJava更簡單,觀察者模式簡單的說就是”訂閱-釋出”的模式,舉一例子說,當你訂閱某家牛奶店的早餐奶(訂閱過程),只要牛奶店生產牛奶,便會給你送過去(釋出過程)。這裡的牛奶店只有一家,但是訂閱的人可以很多,這是一種一對多的關係,只要牛奶店釋出牛奶,那麼訂閱的人就會收到牛奶。換做RxJava裡面的話,牛奶店就是被觀察者(Observable),訂閱的人就是觀察者(Observer),根據這個例子,我們通過程式碼來實現這段邏輯

1、建立觀察者和被觀察者

//被觀察者
public interface Observable {
    //訂閱
    void subscribe(Observer observer);
    //取消訂閱
    void cancel(Observer observer);
    //釋出
    void onNext();
}
複製程式碼
//觀察者
public interface Observer {
    //接收通知
    void onNotify();
}
複製程式碼

2、實現觀察者和被觀察者

//牛奶店
public class MilkFactory implements Observable{

    private List<Observer> observers;

    public MilkFactory() {
        this.observers = new ArrayList<>();
    }

    @Override
    public void subscribe(Observer observer) {
        observers.add(observer);
    }

    @Override
    public void cancel(Observer observer) {
        observers.remove(observer);
    }

    @Override
    public void onNext() {
        for (Observer observer : observers) {
            observer.onNotify();
        }
    }
}
複製程式碼
//顧客
public class MilkConsumer implements Observer {

    private String name;

    public MilkConsumer(String name) {
        this.name = name;
    }

    @Override
    public void onNotify() {
        System.out.println(this.name + " 收到牛奶");
    }
}
複製程式碼

3、觀察者訂閱被觀察者

public static void main(String[] args) {
    Observable milkFactory = new MilkFactory();

    Observer milkConsumer1 = new MilkConsumer("顧客1");
    Observer milkConsumer2 = new MilkConsumer("顧客2");
    //訂閱過程
    milkFactory.subscribe(milkConsumer1);
    milkFactory.subscribe(milkConsumer2);
    //釋出過程
    System.out.println("此時,牛奶店已經產出早餐奶,通知併傳送給各位顧客");
    milkFactory.onNext();
}
複製程式碼

4、檢視程式輸出的結果

此時,牛奶店已經產出早餐奶,通知併傳送給各位顧客
顧客1 收到牛奶
顧客2 收到牛奶
複製程式碼

1.4 RxJava中的觀察者模式

RxJava中的觀察者模式也是跟例子中的大同小異,也是通過建立出觀察者和被觀察者,然後進行訂閱事件,只不過這裡的觀察者和被觀察者已經不在是我們自定義的兩個介面類,而是通過RxJava提供好的觀察者和被觀察者

public static void main(String[] args) {
    //拿到被觀察者
    Observable<String> observable = getObservable();
    //拿到觀察者
    Observer<String> observer = getObserver();
    //訂閱
    observable.subscribe(observer);
}
複製程式碼
public static Observable<String> getObservable() {
    return Observable.create(new ObservableOnSubscribe<String>() {
        @Override
        public void subscribe(@NonNull ObservableEmitter<String> e) throws Exception {
            e.onNext("俊俊俊很帥");
            e.onNext("你值得擁有");
            e.onNext("取消關注");
            e.onNext("但還是要保持微笑");
            e.onComplete();
        }
    });
}

public static Observer<String> getObserver() {
    return new Observer<String>() {

        Disposable disposable = null;

        @Override
        public void onSubscribe(Disposable d) {
            disposable = d;
        }

        @Override
        public void onNext(String s) {
            System.out.println("onNext=" + s);
            if (s.equals("取消關注")) {
                //斷開訂閱
                disposable.dispose();
            }
        }

        @Override
        public void onError(Throwable e) {

        }

        @Override
        public void onComplete() {
            System.out.println("onComplete");
        }
    };
}
複製程式碼

這段程式碼可能看起來比較陌生,不用擔心,我們會在後面的文章中一個個來解釋這裡每個方法的含義,我們可以通過程式的輸出結果看出,跟剛才我們的例子是一樣的效果的

onNext=俊俊俊很帥
onNext=你值得擁有
onNext=取消關注
複製程式碼

1.5 小結

在這裡插入圖片描述