RxJava基础知识点总结

代码实现

场景1:被观察者、观察者和订阅分开写

       /**
         * 先创建一个上游Observable
         * 角色:被观察者
         */
        Observable<String> observable = Observable.create(new ObservableOnSubscribe<String>() {
            @Override
            public void subscribe(@NonNull ObservableEmitter<String> emitter) throws Exception {
                emitter.onNext("hello");
                emitter.onNext("world");
                emitter.onNext("!");

                emitter.onNext("welcome");
                emitter.onNext("here");
                emitter.onComplete();
            }
        });
       /**
         * 创建一个下游Observer
         * 角色:观察者
         */
        Observer<String> observer = new Observer<String>() {
            @Override
            public void onSubscribe(@NonNull Disposable d) {
                Log.d(TAG, "subscribe start");
            }

            @Override
            public void onNext(@NonNull String s) {
                Log.d(TAG, "received content is : " + s);
            }

            @Override
            public void onError(@NonNull Throwable e) {
                Log.d(TAG, "error is : " + e.getMessage());
            }

            @Override
            public void onComplete() {
                Log.d(TAG, "subscribe complete");
            }
        };
//建立连接(上游订阅下游)
observable.subscribe(observer);

场景2:被观察者、观察者和订阅一起写

Observable.create(new ObservableOnSubscribe<String>() {
            @Override
            public void subscribe(@NonNull ObservableEmitter<String> emitter) throws Exception {
                emitter.onNext("hello");
                emitter.onNext("world");
                emitter.onNext("!");

                emitter.onNext("welcome");
                emitter.onNext("here");
                emitter.onComplete();
            }
        }).subscribe(new Observer<String>() {
            @Override
            public void onSubscribe(@NonNull Disposable disposable) {
                Log.d(TAG, "subscribe start");
            }

            @Override
            public void onNext(@NonNull String s) {
                Log.d(TAG, "received content is : " + s);
            }

            @Override
            public void onError(@NonNull Throwable e) {
                Log.d(TAG, "error is : " + e.getMessage());
            }

            @Override
            public void onComplete() {
                Log.d(TAG, "subscribe complete");
            }
        });
    }

关于ObservableEmitter

ObservableEmitter,顾名思义被观察者的发射器。听着有点滑稽,实际上它就是一个发射器,用于从上游发射要传送的数据或者控制信息到下游。
ObservableEmitter的源代码如下所示。

public interface ObservableEmitter<T> extends Emitter<T> {

    void setDisposable(@Nullable Disposable d);

    void setCancellable(@Nullable Cancellable c);

    boolean isDisposed();

    @NonNull
    io.reactivex.ObservableEmitter<T> serialize();

    @Experimental
    boolean tryOnError(@NonNull Throwable t);
}

ObservableEmitter接受泛型数据,并且继承了一个更加底层的接口Emitter,索性再看看Emitter类的源码。

public interface Emitter<T> {

    void onNext(@NonNull T value);

    void onError(@NonNull Throwable error);

    void onComplete();
}

下面简要介绍下重点的几个方法。
1) onNext(@NonNull T value)方法
这个方法就是最关键的方法了,当被观察者和观察者建立了连接。那么,正常情况下只要没有发生错误或者连接被废弃的话。上游(被观察者)就会通过这个方法往下游(观察者)传递消息,下游 会在onNext方法中接受到消息,进行相应的处理。

2)onError(@NonNull Throwable error)方法
这个方法一般是在发生错误时,上游会将错误信息封装在Throwable中抛给下游,下游会在onError方法中接受到错误信息进行相应的错误处理。
这里需要格外注意的是:当emitter抛出错误时,连接将中断,后面再进行onNext(@NonNull T value)也不会得到任何回应了。另外,onError(@NonNull Throwable error)方法也只会调用一次,写100个onError(@NonNull Throwable error)也只有第一个会调用。后面的不但不会调用,还会出错。

3)onComplete()方法
改方法调用后,下游会在onComplete()方法中回应,上下游的连接即可中断。上游再调用onNext(@NonNull T value)方法也不会得到任何回应了。onComplete()方法也是只调用一次,而且跟onError是互斥的,他俩都可以即可中断连接。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值