RxJava結合源碼學習一
基本概念
1、首先,你得有個 Observable 被觀察者
2、其次,你得有個 Observer 觀察者,這是一個接口
3、接着,你得知道RxJava給了你一個觀察者叫 Subscriber 訂閱者,這是一個實現了Observer的抽象類,你可以直接用,那他跟 Observer 有什麼區別呢?多了下面幾個方法:
- add()
- unsubscribe() 取消訂閱
- isUnsubscribed() 判斷是否取消訂閱了
- onStart() 這個方法在訂閱者和被觀察者一連接但還沒開始提交或者發送通知的時候被調用,可以在這個方法寫一些初始化
- request()
- addToRequested()
- setProducer()
4、瞭解了Observable和Observer,以及Subscriber,這三個概念之後,我們就可以開始動手創建一個被觀察者了,如何創建呢?下面是基本的創建一個被觀察者代碼:
Observable<String> observable = Observable.create(new Observable.OnSubscribe<String>() {
@Override
public void call(Subscriber<? super String> subscriber) {
subscriber.onNext("Next1");
subscriber.onNext("Next2");
subscriber.onNext("Next3");
subscriber.onCompleted();
}
})
分析下這段代碼,我們可以通過Observable.create來創建一個Observable被觀察者,需要傳入一個Observable.OnSubscribe參數,這個參數是幹嘛的呢?我們先通過源碼來看下這個創建方法的註釋
Returns an Observable that will execute the specified function when a {@link Subscriber} subscribes to it.
字面上的翻譯是:返回一個被觀察者,當一個訂閱者訂閱它,會執行指定的方法,所以知道這個 Observable.OnSubscribe 參數,實現的call方法,裏面就是我們指定的要告訴訂閱者執行的方法。具體要執行的方法就是 subscriber 執行三遍 onNext() ,然後執行一遍 onCompleted()
5、瞭解瞭如何創建被觀察者了,在有了被觀察者之後,我們就要創建觀察者來執行這些方法了,那如何創建觀察者呢?下面是基本的創建一個觀察者代碼:
Observer<String> observer = new Observer<String>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(String s) {
}
};
Subscriber<String> subscriber = new Subscriber<String>() {
@Override
public void onCompleted() {
}
@Override
public void onError(Throwable e) {
}
@Override
public void onNext(String s) {
}
}
這是基本的創建觀察者的方式,可以選擇Observer或者Subscriber,直接new一個對象,實現接口的方法即可,這個不難。
6、有了被觀察者和觀察者之後,我們就需要將兩者關聯起來了,就是觀察者觀察被觀察者,或者訂閱者訂閱被觀察者,但RxJava這邊的實現方法是這樣的:
//第一種訂閱
observable.subscribe(observer);
//第二種訂閱
observable.subscribe(subscriber);
RxJava按調用的順序來講是反着的,像是被觀察者訂閱了觀察者,訂閱了訂閱者一樣。但我們可以這樣理解,在創建被觀察者的時候,是被觀察者主動指定觀察者應該執行哪些方法的,所以這邊被觀察者訂閱觀察者也是可以接受的。
7、將被觀察者和觀察者聯繫起來後,我們稍微看下RxJava內部subscribe的源碼,稍微簡化了下:
static <T> Subscription subscribe(Subscriber<? super T> subscriber, Observable<T> observable) {
subscriber.onStart();
hook.onSubscribeStart(observable, observable.onSubscribe).call(subscriber);
return hook.onSubscribeReturn(subscriber);
}
#RxJavaObservableExecutionHook.java
public abstract class RxJavaObservableExecutionHook {
public <T> OnSubscribe<T> onSubscribeStart(Observable<? extends T> observableInstance, final OnSubscribe<T> onSubscribe) {
// pass through by default
return onSubscribe;
}
}
- 方法先調用subscriber觀察者的onstart()方法
- 接着通過hook.onSubscribeStart()調用call()方法,其中通過源碼可以知道hook.onSubscribeStart()返回的就是onSubscribe,也就是我們創建被觀察者的時候指定的方法
- 最後返回subscriber,方便後續的操作。
8、到這裏,我們整條線就通了,但是我們有時候會看到如下的RxJava代碼
Action0 onCompleted = new Action0() {
@Override
public void call() {
}
};
Action1<String> onNext = new Action1<String>() {
@Override
public void call(String s) {
}
};
Action1<Throwable> onError = new Action1<Throwable>() {
@Override
public void call(Throwable throwable) {
}
} ;
observable.subscribe(onNext)
observable.subscribe(onNext,onError);
observable.subscribe(onNext,onError,onCompleted);
這裏的Action又是什麼呢?我們看下RxJava這些調用相關內部的方法源碼,簡化後:
public final Subscription subscribe(final Action1<? super T> onNext) {
Action1<Throwable> onError = InternalObservableUtils.ERROR_NOT_IMPLEMENTED;
Action0 onCompleted = Actions.empty();
return subscribe(new ActionSubscriber<T>(onNext, onError, onCompleted));
}
public final Subscription subscribe(final Action1<? super T> onNext, final Action1<Throwable> onError) {
Action0 onCompleted = Actions.empty();
return subscribe(new ActionSubscriber<T>(onNext, onError, onCompleted));
}
public final Subscription subscribe(final Action1<? super T> onNext, final Action1<Throwable> onError, final Action0 onCompleted) {
return subscribe(new ActionSubscriber<T>(onNext, onError, onCompleted));
}
public final Subscription subscribe(Subscriber<? super T> subscriber) {
return Observable.subscribe(subscriber, this);
}
通過源碼我們可以知道最終他會通過一個onError,一個onCompleted和一個onNext三個Action來構造一個ActionSubscriber對象,這個時候分三種情況:
- 當我們只傳入一個 Action1 onNext 時,這個對象會給我們加一個 ERROR_NOT_IMPLEMENTED 沒有實現的 Action1 onError 和一個空的 Actio0 onCompleted ,構造一個ActionSubscriber;
- 當我們傳入的是 Action1 onNext 和 Action1 onError 時,它會幫我們再加一個空的 Action0 onCompleted ,構造一個ActionSubscriber;
- 當我們傳入的是 Action1 onNext 、Action1 onError 、Action0 onCompleted 時,它剛好構造一個ActionSubscriber
細心的同學可能會發現了,onNext對應的是Action1,onError對應的Action1,onCompleted對應的Action0,下面是ActionSubscriber類的源碼。
public final class ActionSubscriber<T> extends Subscriber<T> {
final Action1<? super T> onNext;
final Action1<Throwable> onError;
final Action0 onCompleted;
public ActionSubscriber(Action1<? super T> onNext, Action1<Throwable> onError, Action0 onCompleted) {
this.onNext = onNext;
this.onError = onError;
this.onCompleted = onCompleted;
}
@Override
public void onNext(T t) {
onNext.call(t);
}
@Override
public void onError(Throwable e) {
onError.call(e);
}
@Override
public void onCompleted() {
onCompleted.call();
}
}
通過代碼可以知道,ActionSubscriber是繼承Subscriber,也是屬於一個訂閱者。只是通過它我們可以分離出其中的Action。