几种Subject

Rxjava的几种Subject:

Subject 既是 Observable 又是 Observer(Subscriber)。官网称 Subject 可以看成是一个桥梁或者代理。

介绍下边几种AsyncSubject、BehaviorSubject、ReplaySubject和PublishSubject。

1. AsyncSubject

Observer会接收AsyncSubject的onComplete()之前的最后一个数据。

2. BehaviorSubject

Observer会接收到BehaviorSubject被订阅之前的最后一个数据,再接收订阅之后发射过来的数据。如果BehaviorSubject被订阅之前没有发送任何数据,则会发送一个默认数据。

3. ReplaySubject

ReplaySubject会发射所有来自原始Observable的数据给观察者,无论它们是何时订阅的。

4. PublishSubject

Observer只接收PublishSubject被订阅之后发送的数据。

public class SubjectLearn {

    public static void main(String[] args){

        //testAsyncSubject();
      //  testBehaverSubject();
     //   testReplaySubJect();
        testPubshSubject();
    }


    private static void testAsyncSubject(){
        AsyncSubject<String> subject = AsyncSubject.create();
        subject.onNext("item1");
        subject.onNext("item2");
        subject.onComplete();
        subject.subscribe(new Consumer<String>() {
            @Override
            public void accept(String s) throws Exception {
                System.out.println("async" + s);
            }
        }, new Consumer<Throwable>() {
            @Override
            public void accept(Throwable throwable) throws Exception {
                System.out.println("onError:" + throwable.getMessage());
            }
        }, new Action() {
            @Override
            public void run() throws Exception {
                System.out.println("onComplete");
            }
        });

        subject.onNext("item3");
        subject.onNext("item4");
    }


    private static void testBehaverSubject(){
        BehaviorSubject<String> subject = BehaviorSubject.createDefault("default item");

        subject.onNext("item0");

        subject.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 {
                System.out.println("错误:" + throwable);
            }
        }, new Action() {
            @Override
            public void run() throws Exception {
                System.out.println("结束");
            }
        });

        subject.onNext("item1");
        subject.onNext("item2");
    }


    public static void testReplaySubJect(){
        ReplaySubject<String> subject = ReplaySubject.createWithSize(1);
        subject.onNext("item1");
        subject.onNext("item2");

        subject.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 {
                System.out.println("错误:" + throwable);
            }
        }, new Action() {
            @Override
            public void run() throws Exception {
                System.out.println("结束");
            }
        });

        subject.onNext("item3");
        subject.onNext("item4");
        subject.onComplete();
    }

    public static void testPubshSubject(){
        PublishSubject<String> subject = PublishSubject.create();
        subject.onNext("item1");
        subject.onNext("item2");
        //subject.onComplete();

        subject.subscribeOn(Schedulers.io())
                .subscribe(new Consumer<String>() {
            @Override
            public void accept(String o) throws Exception {
                System.out.println("收到:" + o);
            }
        }, new Consumer<Throwable>() {
            @Override
            public void accept(Throwable throwable) throws Exception {
                System.out.println("错误:" + throwable);
            }
        }, new Action() {
            @Override
            public void run() throws Exception {
                System.out.println("结束");
            }
        });

        subject.onNext("item3");
        subject.onNext("item4");
        subject.onComplete();

        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

猜你喜欢

转载自blog.csdn.net/crookshanks_/article/details/82829087