Rx系列:RxJava之4種Subject

4種Subject 分別爲:PublishSubject、ReplaySubject、BehaviorSubject、AsyncSubject

Subject將觀察者和被觀察者結合爲一體,是觀察者和被觀察者的代理。

(1)AsyncSubject

    AsyncSubject asyncSubject = AsyncSubject.create();
    asyncSubject.onNext("A");
    asyncSubject.onNext("B");
    asyncSubject.subscribe(new Consumer<String>() {
        @Override
        public void accept(String s) throws Exception {
            System.out.println("接收發射過來的數據:"+s);
        }
    }, new Consumer<Throwable>() {
        @Override
        public void accept(Throwable throwable) throws Exception {

        }
    }, new Action() {
        @Override
        public void run() throws Exception {
            System.out.println("執行完成!");
        }
    });

    asyncSubject.onNext("C");
    asyncSubject.onComplete();

日誌如下:
圖片.png
也就是說,AsyncSubject 無論發射多少條數據,無論在訂閱前發射還是在訂閱後發射,都只會收到最後一條發射的數據。

(2)BehaviorSubject

    BehaviorSubject behaviorSubject = BehaviorSubject.create();
    behaviorSubject.onNext("A");
    behaviorSubject.onNext("B");
    behaviorSubject.subscribe(new Consumer<String>() {
        @Override
        public void accept(String s) throws Exception {
            System.out.println("接收發射過來的數據:"+s);
        }
    }, new Consumer<Throwable>() {
        @Override
        public void accept(Throwable throwable) throws Exception {

        }
    }, new Action() {
        @Override
        public void run() throws Exception {
            System.out.println("執行完成!");
        }
    });

    behaviorSubject.onNext("C");
    behaviorSubject.onComplete();

日誌如下:
圖片.png
也就是說,BehaviorSubjec只會接收到訂閱前最後一條發射的數據以及訂閱之後所有的數據。

(3)ReplaySubject

    ReplaySubject replaySubject = ReplaySubject.create();
    replaySubject.onNext("A");
    replaySubject.onNext("B");
    replaySubject.subscribe(new Consumer<String>() {
        @Override
        public void accept(String s) throws Exception {
            System.out.println("接收發射過來的數據:"+s);
        }
    }, new Consumer<Throwable>() {
        @Override
        public void accept(Throwable throwable) throws Exception {

        }
    }, new Action() {
        @Override
        public void run() throws Exception {
            System.out.println("執行完成!");
        }
    });

    replaySubject.onNext("C");
    replaySubject.onComplete();

日誌如下:
圖片.png
也就是說,ReplaySubject會接收到全部數據。

這裏需要補充一下:
ReplaySubject可以限制緩存的大小,也可以限制緩存的時間

    ReplaySubject replaySubject = ReplaySubject.createWithSize(1);
    ReplaySubject replaySubject = ReplaySubject.createWithTime(1000, TimeUnit.MILLISECONDS, Schedulers.newThread());
    ReplaySubject replaySubject = ReplaySubject.createWithTimeAndSize(1000, TimeUnit.MILLISECONDS, Schedulers.newThread(), 1);
  • createWithSize 限制可以接收訂閱前發射數據的條數;
  • createWithTime 限制時間內可以接收訂閱前發射的數據;
  • createWithTimeAndSize 限制時間內可以接收訂閱前發射數據的條數;

(4)PublishSubject

    PublishSubject publishSubject = PublishSubject.create();

    publishSubject.onNext("A");
    publishSubject.onNext("B");
    publishSubject.subscribe(new Consumer<String>() {
        @Override
        public void accept(String s) throws Exception {
            System.out.println("接收發射過來的數據:"+s);
        }
    }, new Consumer<Throwable>() {
        @Override
        public void accept(Throwable throwable) throws Exception {

        }
    }, new Action() {
        @Override
        public void run() throws Exception {
            System.out.println("執行完成!");
        }
    });

    publishSubject.onNext("C");
    publishSubject.onComplete();

日誌如下:
圖片.png
也就是說,PublishSubject只會接收到訂閱之後的所有數據。

參考:https://www.jianshu.com/p/117fcda8df97

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