我的RxJava学习之旅 二

AsyncSubject 它可以是被观察者 也可以是观察者 (ps: 雌雄同体)

public static void test4(){
//        public abstract class Subject<T, R> extends Observable<R> implements Observer<T>  源码

        AsyncSubject<String> observable = AsyncSubject.create();
        observable.onNext("Hello gggg1");
        observable.onNext("Hello gggg2");
        observable.onNext("Hello gggg3");
        observable.onCompleted();

        Action1<String> stringAction1 = new Action1<String>() {
            @Override
            public void call(String s) {
                Log.v(TAG,"...s.. = " + s);
            }
        };

        observable.subscribe(stringAction1);
    }

通过代码的实践可以发现: AsyncSubject在创建之后就可以发送事件,不必等到建立订阅关系.通过log打印发现 如果不调用onCompleted方法就接受不到任何事件,接受到的事件是onCompleted之前的一个事件(只能接受一个) 如果调用onError方法,因为观察者中没有处理会直接报错

BehaviorSubject      继承关系和上面的一样,我们还是通过log来观察它的变化

BehaviorSubject<String> observable = BehaviorSubject.create("default");
        observable.onNext("Hello gggg1");
        observable.onNext("Hello gggg2");
        observable.onNext("Hello gggg3");

        Action1<String> action1 = new Action1<String>() {
            @Override
            public void call(String s) {
                Log.v(TAG,"...s.. = " + s);
            }
        };

        observable.subscribe(action1);

可以看到log为订阅前的最后一条事件

BehaviorSubject<String> observable = BehaviorSubject.create("default");
        observable.onNext("Hello gggg1");
        observable.onNext("Hello gggg2");
        observable.onNext("Hello gggg3");

        Action1<String> action1 = new Action1<String>() {
            @Override
            public void call(String s) {
                Log.v(TAG,"...s.. = " + s);
            }
        };

        observable.subscribe(action1);
        observable.onNext("Hello gggg1");
        observable.onNext("Hello gggg2");

订阅后的全部事件都打印出来了

BehaviorSubject<String> observable = BehaviorSubject.create("default");
        /*observable.onNext("Hello gggg1");
        observable.onNext("Hello gggg2");
        observable.onNext("Hello gggg3");*/

        Action1<String> action1 = new Action1<String>() {
            @Override
            public void call(String s) {
                Log.v(TAG,"...s.. = " + s);
            }
        };

        observable.subscribe(action1);
        observable.onNext("Hello gggg1");
        observable.onNext("Hello gggg2");

如果订阅前没有事件发出,那么默认的则会执行

PublishSubject 创建和上面的一样,区别就是它只能接受订阅后的事件

ReplaySubject 创建和上面一样,它能接受所有的事件(订阅前后都能接收)

总结:Subject这四个子类在创建被观察者后就可以发送事件, 而普通的被观察者必须在产生订阅关系后才能发送事件


设置被观察者发送事件的时间

public static void test6(){
        // 设置被观察者发送事件的时间
        Observable<String> observable = Observable.create(new Observable.OnSubscribe<String>() {
            @Override
            public void call(Subscriber<? super String> subscriber) {
                subscriber.onNext("Hello Android");
                subscriber.onCompleted();

            }
        });
        ConnectableObservable<String> publish = observable.publish(); //将普通被观察者转换为连接的被观察者
//        ConnectableObservable<String> replay = observable.replay();

//        Observable<String> observable1 = publish.refCount(); // 将可连接的被观察者转换为普通的被观察者

        Observer<String> observer = new Observer<String>() {
            @Override
            public void onCompleted() {

            }

            @Override
            public void onError(Throwable e) {

            }

            @Override
            public void onNext(String s) {
                Log.v(TAG,"...s.. = " + s);
            }
        };

        publish.subscribe(observer);
        publish.connect(); // 只有调用这个方法是 被观察者才会发送事件
    }
重点: 如果普通的被观察者转换为可连接的被观察者时用的是publish方法,那么只有在connect方法之前的订阅可以接受到事件,connect方法之后的订阅是不能接收到事件的,如果想不分connect方法位置都能接受到事件,那么转换的时候请用replay方法




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

plx_csdn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值