當Rxjava火了很久之後,纔想起來學習一哈,不然就落伍了……^_^
Rxjava是基於觀察者模式設計的,(至於什麼是觀察者模式,有需要了解的自己查,哈哈哈)。
上硬菜,首先這裏涉及到兩個概念,觀察者和被觀察者。被觀察者發生變化就立馬通知觀察者,做出相應的事件處理過程。這就是Observable(被觀察者)和Observer(觀察者)。它們之間通過訂閱關係連接。
首先來一個最簡單的Observable代碼。
Observable<Integer> observable=Observable.create(new ObservableOnSubscribe<Integer>() {
@Override
public void subscribe(@NonNull ObservableEmitter<Integer> e) throws Exception {
//被觀察者的動作
e.onNext(1);
e.onNext(2);
e.onNext(3);
e.onComplete();
}
});
我這裏將泛型定義爲Integer類型,ObservableEmitter即爲發送消息的載體,就像handler一樣。
它有兩個常用的方法,onNext()和onComplete(); 第一個方法是填寫發送的消息內容,第二個是提示這一階段發送完成。
接下來看觀察者的代碼
//創建觀察者
Observer<Integer> observer=new Observer<Integer>() {
//private Disposable disposable;
@Override
public void onSubscribe(@NonNull Disposable d) {
Log.e(TAG,"-->subscrible");
disposable=d;
}
@Override
public void onNext(@NonNull Integer integer) {
Log.e(TAG,"-->"+integer);
//disposable.dispose(); //截流
}
@Override
public void onError(@NonNull Throwable e) {
Log.e(TAG,"-->error");
}
@Override
public void onComplete() {
Log.e(TAG,"-->finish");
}
};
剛剛講過它們通過訂閱關係來連接的那就是被觀察者訂閱觀察者,而不是我們平常理解的那樣觀察者訂閱被觀察者,我們可以這樣連接,被觀察者是上游,觀察者是下游,當上遊發送消息時,下游纔可以收到,觀察者是被動的,而被觀察者是主動的,所以是被觀察者訂閱觀察者,不知道這樣說是否能讓大家看明白沒有。
//被觀察者訂閱觀察者
observable.subscribe(observer);
但是,請注意,並不意味着你可以隨意亂七八糟發射事件,需要滿足一定的規則:
上游可以發送無限個onNext, 下游也可以接收無限個onNext.
當上遊發送了一個onComplete後, 上游onComplete之後的事件將會繼續發送, 而下游收到onComplete事件之後將不再繼續接收事件.
當上遊發送了一個onError後, 上游onError之後的事件將繼續發送, 而下游收到onError事件之後將不再繼續接收事件.
上游可以不發送onComplete或onError.
最爲關鍵的是onComplete和onError必須唯一併且互斥, 即不能發多個onComplete, 也不能發多個onError, 也不能先發一個onComplete, 然後再發一個onError, 反之亦然。
好了,今天就學習到這裏,馬上下班啦