Observable的創建流程分析
首先看一張Rxjava的時序圖:
step1.Observable.create
在我們的使用案例中,第一步創建一個Observable對象,我們是通過Observable的Create方法來創建一個Observable實例, 我們就從這個方法開始深入源碼分析Observeble的創建過程;
實質上 這就包括了上面時序圖中的兩步,先創建一個ObservableOnSubscribe(這是一個接口)實例,它是具有subscribe方法的函數接口,該方法接收ObservableEmitter實例,該實例允許以取消安全的方式推送事件
所以會通過new ObservableOnSubscribe()創建一個匿名內部類,裏面就一個方法,也是我們實現的那個方法:
new ObservableOnSubscribe<String>() {
@Override
public void subscribe(ObservableEmitter<String> emitter) throws Exception {
if (!emitter.isDisposed()){
emitter.onNext("發射一條消息:");
emitter.onNext("你好!Rxjava");
}
emitter.onComplete();
}
}
ObservableEmitter也是一個接口。裏面方法很多,它也繼承了 Emitter 接口。
public interface ObservableEmitter<T> extends Emitter<T> {
//設置事件流的控制器,用於控制事件流取消
void setDisposable(@Nullable Disposable d);
//類似Disposable的功能 取消事件
void setCancellable(@Nullable Cancellable c);
//判斷是否中斷了
boolean isDisposed();
//序列化
ObservableEmitter<T> serialize();
//嘗試去發送一個錯誤的事件流
boolean tryOnError(@NonNull Throwable t);
}
public interface Emitter<T> {
void onNext(T value);
void onError(Throwable error);
void onComplete();
}
Emitter定義了 我們在ObservableOnSubscribe中實現subscribe()方法裏最常用的三個方法
其次纔將該匿名內部類實例作爲參數傳遞調用create方法
public abstract class Observable<T> implements ObservableSource<T> {
......
@CheckReturnValue
@NonNull
@SchedulerSupport(SchedulerSupport.NONE)
//通過Observable的create方法創建一個冷的Observable 需要傳一個ObservableOnSubscribe的參數
public static <T> Observable<T> create(ObservableOnSubscribe<T> source) {
//非空斷言 source不能爲null,爲null拋出異常
ObjectHelper.requireNonNull(source, "source is null");
//Observable是abstract的抽象類 ObservableCreate是其一個實現類
return RxJavaPlugins.onAssembly(new ObservableCreate<T>(source));
}
......
}
step2.new ObservableCreate(source)
創建一個Observable的實現類,這個類纔是真正處理訂閱 以及分發事件的類;
具體是怎麼實現訂閱等後續分析
step3.RxJavaPlugins.onAssembly(ObservableCreate)
/**
* Calls the associated hook function.
* 調用關聯的鉤子函數
* @param <T> the value type
* @param source the hook's input value
* @return the value returned by the hook
*/
@SuppressWarnings({ "rawtypes", "unchecked" })
@NonNull
public static <T> Observable<T> onAssembly(@NonNull Observable<T> source) {
Function<? super Observable, ? extends Observable> f = onObservableAssembly;
if (f != null) {
return apply(f, source);
}
return source;
}
顯然通過註釋我們知道,這是一個鉤子函數,也就是說如果 onObservableAssembly 的值不爲空,那麼就調用這個鉤子函數,onObservableAssembly 是一個靜態變量,需要我們主動的去設置纔會賦值,這裏當做空來考慮,如果 onObservableAssembly 爲空的話,也就是說這個方法啥都沒做,直接返回 source 參數,也就是上面的 ObservableCreate 對象,在大多數情況下,這個函數返回的還是函數傳入的參數source;
step4 返回Observeble
在經過前面三步,我們可以發現Observeble的create方法,在沒有異常及Hook處理的情況下,返回的就是在step2中創建的ObservableCreate對象,也正是在這個類中我們可以觀察到訂閱以及對其他事件的處理