RxJava2 (五)just操作符源碼閱讀

當前版本 2.2.19
RxJava2 (一)訂閱流程源碼閱讀
RxJava2 (二)取消訂閱流程 dispose( ) 源碼閱讀
RxJava2 (三)線程切換源碼閱讀
RxJava2 (四)切換UI主線程源碼閱讀
RxJava2 (五)just操作符源碼閱讀
RxJava2 (六)map操作符源碼閱讀

代碼示例
Observable.just(1, 2, 3,4,5,6,7,8,9,10)
        .subscribe(new Observer<Integer>() {
            @Override
            public void onSubscribe(Disposable d) {
                System.out.println("onSubscribe");
            }
            @Override
            public void onNext(Integer integer) {
                System.out.println("onNext: " + integer);
            }
            @Override
            public void onError(Throwable e) {
                System.out.println("onError");
            }
            @Override
            public void onComplete() {
                System.out.println("onComplete");
            }
        });
Observable.just(1, 2, 3,4,5,6,7,8,9,10)

創建一個被觀察者,發送事件,發送事件個數不超過10個以上.

// Observable類
public abstract class Observable<T> implements ObservableSource<T> {
    public static <T> Observable<T> just(T item1, T item2, T item3, T item4, T item5, T item6, T item7, T item8, T item9, T item10) {
       return fromArray(item1, item2, item3, item4, item5, item6, item7, item8, item9, item10); 
    }
    // 創建ObservableFromArray對象並返回
    public static <T> Observable<T> fromArray(T... items) {
        ...
        return RxJavaPlugins.onAssembly(new ObservableFromArray<T>(items));
    }
}
// ObservableFromArray類
public final class ObservableFromArray<T> extends Observable<T> {
    final T[] array;// just操作符中傳入的10個數據現在由array數組保存
    public ObservableFromArray(T[] array) {
        this.array = array;
    }
}
.subscribe()

ObservableFromArray對象調用.subscribe()方法後,最終將調用ObservableFromArray.subscribeActual()

// ObservableFromArray類
public final class ObservableFromArray<T> extends Observable<T> {
    final T[] array;// just操作符中傳入的10個數據現在由array數組保存
    public ObservableFromArray(T[] array) {
        this.array = array;
    }
    @Override
    public void subscribeActual(Observer<? super T> observer) {
        // observer: 手動創建的觀察者對象
        // array: just符號傳入的數據數組
        FromArrayDisposable<T> d = new FromArrayDisposable<T>(observer, array);
        // 調用手動創建的觀察者對象的onSubscribe()方法
        observer.onSubscribe(d);
        ...
        // 使觀察者接收數據
        d.run();
    }
    static final class FromArrayDisposable<T> extends BasicQueueDisposable<T> {
        
        FromArrayDisposable(Observer<? super T> actual, T[] array) {
            this.downstream = actual; // 觀察者對象
            this.array = array; // 待發射的數據數組
        }
        // 觀察者接收數據
        void run() {
            T[] a = array;
            int n = a.length;
            for (int i = 0; i < n && !isDisposed(); i++) {
                T value = a[i];
                ...
                // 將just中傳入的數據通過觀察者中的onNext()傳出.
                downstream.onNext(value);
            }
            if (!isDisposed()) {
                // 數據傳遞完成之後就調用觀察者的onComplete()方法
                downstream.onComplete();
            }
        }
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章