RxJava3源碼實現-1-create()+subscribe()

目錄

1、代碼調用流程圖

1.1、create()

1.2、subscribe()

2、代碼

2.1、結構目錄

2.2、代碼一

2.3、代碼二

3、輸出

3.1、原生輸出

3.2、手寫輸出


github代碼地址

1、代碼調用流程圖

從下圖中我們可看到:

1、調用create()方法會new 一個ObservableOnSubscribe對象,並將這個對象傳到了ObservableCreate類中;

2、調用subscribe()訂閱時,我們會創建一個Observer對象,並且穿給CreateEmitter類中;

3、然後,調用subscribe()會最後調用:

ObservableCreate_subscribeActual()

----->ObservableOnSubscribe_subscribe()

----->Emitter_onNext()

----->Observer_onNext()

4、這樣我們Create()方法中的onNext()中的值,就傳到了Observer中onNext()方法中。

1.1、create()

1.2、subscribe()

2、代碼

2.1、結構目錄

2.2、代碼一

YoObservableSource--->YoObservable--->YoObservableCreate

它們三者是繼承關係。

public interface YoObservableSource<T> {
    void subscribe(YoObserver<? super T> yoObserver);
}
----------------------------------------------------------------------------

public abstract class YoObservable<T> implements YoObservableSource<T> {

    @Override
    public void subscribe(YoObserver<? super T> yoObserver) {
        subscribeActual(yoObserver);
    }
    public static YoObservable create(YoObservableOnSubscribe source) {
        return new YoObservableCreate(source);
    }
    protected abstract void subscribeActual(YoObserver<? super T> observer);
}
----------------------------------------------------------------------------

public class YoObservableCreate<T> extends YoObservable<T> {
    private final YoObservableOnSubscribe<T> source;

    public YoObservableCreate(YoObservableOnSubscribe<T> source) {
        this.source = source;
    }

    @Override
    protected void subscribeActual(YoObserver<? super T> observer) {
        YoEmitter emitter = new YoCreateEmitter(observer);
        source.subscribe(emitter);
    }

    static final class YoCreateEmitter<T> implements YoEmitter<T> {

        final YoObserver<? super T> observer;

        YoCreateEmitter(YoObserver<? super T> observer) {
            this.observer = observer;
        }
        @Override
        public void onNext(T t) {
            if (!isDisposed()) {
                observer.onNext(t);
            }
        }
        @Override
        public void onError(Throwable t) {
            if (!isDisposed()) {
                try {
                    observer.onError(t);
                } finally {
                    dispose();
                }
            }
        }
        @Override
        public void onComplete() {
            if (!isDisposed()) {
                try {
                    observer.onComplete();
                } finally {
                    dispose();
                }
            }
        }
        void dispose() {
            // 取消訂閱
        }
        @Override
        public boolean isDisposed() {
            return false;
        }
    }
}

2.3、代碼二

YoEmitter        YoObservableOnSubscribe             YoObserver

public interface YoEmitter<T> {

    void onNext(T value);

    void onError(Throwable error);

    void onComplete();

    boolean isDisposed();
}
-------------------------------------------------------------------------

public interface YoObservableOnSubscribe<T> {

    void subscribe(YoEmitter<T> emitter);
}
-------------------------------------------------------------------------

public interface YoObserver<T> {

    void onSubscribe();

    void onNext(T t);

    void onError(Throwable e);

    void onComplete();
}

3、輸出

3.1、原生輸出

 Observable<String> observable = Observable.create(new ObservableOnSubscribe<String>() {
            @Override
            public void subscribe(@NonNull ObservableEmitter<String> e) throws Throwable {
                log("開始發送消息!");
                e.onNext("A");
                e.onNext("B");
                e.onNext("C");
                e.onComplete();
            }
        }).doOnNext(s -> log("發送消息:" + s));

        observable.subscribe(new Observer<String>() {
            @Override
            public void onSubscribe(@NonNull Disposable d) {
                log("我剛被訂閱上,開始初始化工作!");
            }
            @Override
            public void onNext(@NonNull String s) {
                log("我接收到:" + s);
            }
            @Override
            public void onError(@NonNull Throwable e) {
                log("錯誤:" + e.getMessage());
            }
            @Override
            public void onComplete() {
                log("接受完成!");
            }
        });

//輸出結果
main:我剛被訂閱上,開始初始化工作!
main:開始發送消息!
main:發送消息:A
main:我接收到:A
main:發送消息:B
main:我接收到:B
main:發送消息:C
main:我接收到:C
main:接受完成!

3.2、手寫輸出

  YoObservable yoObservable = YoObservable.create(new YoObservableOnSubscribe<String>() {
            @Override
            public void subscribe(YoEmitter<String> e) {
                log("發送消息:A");
                e.onNext("A");
                log("發送消息:B");
                e.onNext("B");
                log("發送消息:C");
                e.onNext("C");
                e.onComplete();
            }
        });
     
        yoObservable.subscribe(new YoObserver<String>() {
            @Override
            public void onSubscribe() {
                log("我剛被訂閱上,開始初始化工作!");
            }

            @Override
            public void onNext(String s) {
                log("我接收到:" + s);
            }

            @Override
            public void onError(@NonNull Throwable e) {
                log("錯誤:" + e.getMessage());
            }

            @Override
            public void onComplete() {

                log("接受完成!");
            }
        });
//輸出
main:發送消息:A
main:我接收到:A
main:發送消息:B
main:我接收到:B
main:發送消息:C
main:我接收到:C
main:接受完成!

 

 

 

 

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章