RxJava基础学习4-功能操作符

1、subscribe() 操作符

连接 被观察者 和 观察者

//创建被观察者
        Observable observable = Observable.create(new ObservableOnSubscribe() {
            @Override
            public void subscribe(ObservableEmitter emitter) throws Exception {
                emitter.onNext("事件1");
                emitter.onNext("事件2");
            }
        });

        //创建观察者
        Observer observer = new Observer() {
            @Override
            public void onSubscribe(Disposable d) {
                Log.d(TAG + "subscribe", "开始连接");
            }

            @Override
            public void onNext(Object o) {
                Log.d(TAG + "subscribe", "收到:" + o.toString());
            }

            @Override
            public void onError(Throwable e) {

            }

            @Override
            public void onComplete() {

            }
        };

        //通过subscribe 进行 被观察者(Observable)与观察者(Observer)的连接
        observable.subscribe(observer);
2022-05-11 14:11:03.442 26655-26655/? D/MainActivitysubscribe: 开始连接
2022-05-11 14:11:03.442 26655-26655/? D/MainActivitysubscribe: 收到:事件1
2022-05-11 14:11:03.442 26655-26655/? D/MainActivitysubscribe: 收到:事件2

2、delay() 操作符

     * 延迟发送事件
     * 
     * delay有多个重载方法:
     * delay(long delay,TimeUnit unit) :指定延迟时间。 参数一:时间 ; 参数二:时间单位
     * delay(long delay, TimeUnit unit, Scheduler scheduler)  指定延迟时间&线程调度器。参数一:时间 ; 参数二:时间单位;参数三: 线程调度器
     * delay(long delay, TimeUnit unit, boolean delayError)  指定延迟时间&线程调度器。参数一:时间 ; 参数二:时间单位;参数三: 是否错误延迟
     * delay(long delay, TimeUnit unit, Scheduler scheduler, boolean delayError)  指定延迟时间&线程调度器&错误延迟。参数一:时间 ; 参数二:时间单位;
     * 参数三: 线程调度器; 参数四:是否错误延迟(若中间发生错误,是否如常执行,执行完在执行onError())

 

 Observable.just(11,22,33,24,35)
                .delay(2, TimeUnit.SECONDS)
                .subscribe(new Consumer<Integer>() {
                    @Override
                    public void accept(Integer integer) throws Exception {
                        Log.d(TAG + "delay", String.valueOf(integer));
                    }
                });
2022-05-11 14:26:17.733 27641-27641/com.app.empty D/MainActivitydelay: start
2022-05-11 14:26:22.737 27641-27707/com.app.empty D/MainActivitydelay: 11
2022-05-11 14:26:22.737 27641-27707/com.app.empty D/MainActivitydelay: 22
2022-05-11 14:26:22.738 27641-27707/com.app.empty D/MainActivitydelay: 33
2022-05-11 14:26:22.738 27641-27707/com.app.empty D/MainActivitydelay: 24
2022-05-11 14:26:22.738 27641-27707/com.app.empty D/MainActivitydelay: 35

3、do 系列操作符
   

     * 在事件发送&接收的整个周期过程中进行操作。
     * 
     * 如发送事件前的操作,发送事件后的回调请求
     * 
     * do系列操作符包含以下:
     * 
     * doOnEach() :当Observable每发送一次事件就会调用一次(包含onNext(),onError(),onComplete())
     * doOnNext(): 执行 onNext()前调用
     * doAfterNext(): 执行onNext()后调用
     * doOnComplete():执行onComplete()前调用
     * doOnError():执行 onError()前调用
     * doOnTerminate(): 执行终止(无论正常发送完毕/异常终止)
     * doFinally(): 最后执行
     * doOnSubscribe() :观察者订阅是调用
     * doOnUnScbscribe(): 观察者取消订阅时调用

 

 Observable.create(new ObservableOnSubscribe<Integer>() {
                    @Override
                    public void subscribe(ObservableEmitter<Integer> emitter) throws Exception {
                        emitter.onNext(1);
                        emitter.onNext(2);
                        emitter.onNext(3);
                        emitter.onError(new NullPointerException());
                    }
                })
                .doOnEach(new Consumer<Notification<Integer>>() {
                    @Override
                    public void accept(Notification<Integer> integerNotification) throws Exception {
                        Log.d(TAG + "doOnEach", "doOnEach:  " + String.valueOf(integerNotification.getValue()));
                    }
                })
                .doOnNext(new Consumer<Integer>() {
                    @Override
                    public void accept(Integer integer) throws Exception {
                        Log.d(TAG + "doOnNext", "doOnNext:  " + String.valueOf(integer));
                    }
                })
                .doAfterNext(new Consumer<Integer>() {
                    @Override
                    public void accept(Integer integer) throws Exception {
                        Log.d(TAG + "doAfterNext", "doAfterNext:  " + String.valueOf(integer));
                    }
                })
                .doOnComplete(new Action() {
                    @SuppressLint("LongLogTag")
                    @Override
                    public void run() throws Exception {
                        Log.d(TAG + "doOnComplete", "doOnComplete");
                    }
                })
                .doOnError(new Consumer<Throwable>() {
                    @Override
                    public void accept(Throwable throwable) throws Exception {
                        Log.d(TAG + "doOnError", "doOnError");
                    }
                })
                .doOnTerminate(new Action() {
                    @SuppressLint("LongLogTag")
                    @Override
                    public void run() throws Exception {
                        Log.d(TAG + "doOnTerminate", "doOnTerminate");
                    }
                })
                .doAfterTerminate(new Action() {
                    @SuppressLint("LongLogTag")
                    @Override
                    public void run() throws Exception {
                        Log.d(TAG + "doAfterTermi", "doAfterTerminate");
                    }
                })
                .doOnSubscribe(new Consumer<Disposable>() {
                    @SuppressLint("LongLogTag")
                    @Override
                    public void accept(Disposable disposable) throws Exception {
                        Log.d(TAG + "doOnSubscribe", "doOnSubscribe");
                    }
                })
                .doFinally(new Action() {
                    @Override
                    public void run() throws Exception {
                        Log.d(TAG + "doFinally", "doFinally");
                    }
                })
                .subscribe(new Observer<Integer>() {
                    @Override
                    public void onSubscribe(Disposable d) {
                        Log.d(TAG, "onSubscribe");
                    }

                    @Override
                    public void onNext(Integer integer) {
                        Log.d(TAG, "收到的数据:  " + integer);
                    }

                    @Override
                    public void onError(Throwable e) {
                        Log.d(TAG, "onError");
                    }

                    @Override
                    public void onComplete() {
                        Log.d(TAG, "onComplete");
                    }
                });
2022-05-11 14:32:48.947 28024-28024/com.app.empty D/MainActivitydelay: start
2022-05-11 14:32:48.950 28024-28024/com.app.empty D/MainActivitydoOnSubscribe: doOnSubscribe
2022-05-11 14:32:48.950 28024-28024/com.app.empty D/MainActivity: onSubscribe
2022-05-11 14:32:48.950 28024-28024/com.app.empty D/MainActivitydoOnEach: doOnEach:  1
2022-05-11 14:32:48.950 28024-28024/com.app.empty D/MainActivitydoOnNext: doOnNext:  1
2022-05-11 14:32:48.950 28024-28024/com.app.empty D/MainActivity: 收到的数据:  1
2022-05-11 14:32:48.950 28024-28024/com.app.empty D/MainActivitydoAfterNext: doAfterNext:  1
2022-05-11 14:32:48.950 28024-28024/com.app.empty D/MainActivitydoOnEach: doOnEach:  2
2022-05-11 14:32:48.950 28024-28024/com.app.empty D/MainActivitydoOnNext: doOnNext:  2
2022-05-11 14:32:48.950 28024-28024/com.app.empty D/MainActivity: 收到的数据:  2
2022-05-11 14:32:48.950 28024-28024/com.app.empty D/MainActivitydoAfterNext: doAfterNext:  2
2022-05-11 14:32:48.950 28024-28024/com.app.empty D/MainActivitydoOnEach: doOnEach:  3
2022-05-11 14:32:48.950 28024-28024/com.app.empty D/MainActivitydoOnNext: doOnNext:  3
2022-05-11 14:32:48.951 28024-28024/com.app.empty D/MainActivity: 收到的数据:  3
2022-05-11 14:32:48.951 28024-28024/com.app.empty D/MainActivitydoAfterNext: doAfterNext:  3
2022-05-11 14:32:48.951 28024-28024/com.app.empty D/MainActivitydoOnEach: doOnEach:  null
2022-05-11 14:32:48.951 28024-28024/com.app.empty D/MainActivitydoOnError: doOnError
2022-05-11 14:32:48.951 28024-28024/com.app.empty D/MainActivitydoOnTerminate: doOnTerminate
2022-05-11 14:32:48.951 28024-28024/com.app.empty D/MainActivity: onError
2022-05-11 14:32:48.951 28024-28024/com.app.empty D/MainActivitydoFinally: doFinally
2022-05-11 14:32:48.951 28024-28024/com.app.empty D/MainActivitydoAfterTermi: doAfterTerminate

4、onErrorReturn() 操作符

* 可以捕获错误。遇到错误时,发送一个特殊事件,并且正常终止.注意后面的事件不会再发送

Observable.create(new ObservableOnSubscribe<Integer>() {
                    @Override
                    public void subscribe(ObservableEmitter<Integer> emitter) throws Exception {
                        emitter.onNext(1);
                        emitter.onNext(2);
                        emitter.onError(new Throwable("Throwable"));
                        emitter.onNext(3);
                        emitter.onNext(3);
                    }
                })
                .onErrorReturn(new Function<Throwable, Integer>() {
                    @Override
                    public Integer apply(Throwable throwable) throws Exception {
                        Log.e(TAG, "发生了错误:" + throwable.getMessage());
                        return 111111;
                    }
                })
                .subscribe(new Observer<Integer>() {
                    @Override
                    public void onSubscribe(Disposable d) {

                    }

                    @Override
                    public void onNext(Integer integer) {
                        Log.d(TAG, String.valueOf(integer));
                    }

                    @Override
                    public void onError(Throwable e) {
                        Log.d(TAG, e.getMessage());
                    }

                    @Override
                    public void onComplete() {
                        Log.d(TAG, "onComplete");
                    }
                });
2022-05-11 14:35:14.041 28266-28266/com.app.empty D/MainActivitydelay: start
2022-05-11 14:35:14.042 28266-28266/com.app.empty D/MainActivity: 1
2022-05-11 14:35:14.042 28266-28266/com.app.empty D/MainActivity: 2
2022-05-11 14:35:14.042 28266-28266/com.app.empty E/MainActivity: 发生了错误:Throwable
2022-05-11 14:35:14.042 28266-28266/com.app.empty D/MainActivity: 111111
2022-05-11 14:35:14.042 28266-28266/com.app.empty D/MainActivity: onComplete

5.onExceptionResumeNext()/onErrorResumeNext() 操作符

    * 遇到错误时发送一个新的Observable 。并且正常终止.注意原Observable后面的事件不会再发送
     * 如果捕获Exception的话使用onExceptionResumeNext() ,捕获错误的用onErrorResumeNext()

Observable.create(new ObservableOnSubscribe<Integer>() {
            @Override
            public void subscribe(ObservableEmitter<Integer> emitter) throws Exception {
                emitter.onNext(11);
                emitter.onNext(22);
                emitter.onError(new NullPointerException("NullPointerException"));
                emitter.onNext(33);
            }
        }).onExceptionResumeNext(new Observable<Integer>() {
            @Override
            protected void subscribeActual(Observer<? super Integer> observer) {
                observer.onNext(44);
                observer.onNext(55);

            }
        }).subscribe(new Observer<Integer>() {
            @Override
            public void onSubscribe(Disposable d) {

            }

            @Override
            public void onNext(Integer integer) {
                Log.d(TAG, String.valueOf(integer));
            }

            @Override
            public void onError(Throwable e) {
                Log.d(TAG, e.getMessage());
            }

            @Override
            public void onComplete() {
                Log.d(TAG, "onComplete");
            }
        });
2022-05-11 14:35:14.042 28266-28266/com.app.empty D/MainActivity: 1
2022-05-11 14:35:14.042 28266-28266/com.app.empty D/MainActivity: 2
2022-05-11 14:35:14.042 28266-28266/com.app.empty E/MainActivity: 发生了错误:Throwable
2022-05-11 14:35:14.042 28266-28266/com.app.empty D/MainActivity: 111111
2022-05-11 14:35:14.042 28266-28266/com.app.empty D/MainActivity: onComplete


6、retry() 操作符

     * 作用是:出现错误时,让被观察者重新发送数据
     * 注:若发送错误,则一直重新发送
     * 
     * 有几个重载方法:
     * retry() : 出现错误时,让被观察者重新发送数据。若错误一直发生,则一直重新发送
     * 
     * retry(long time):与retry不同的书,若错误一直发生,被观察者则一直重新发送数据,但这持续重新发送有次数限制
     * 
     * retry(Predicate predicate) :  出现错误时,根据指定逻辑(可以捕获到发生的错误)决定是否让被观察者重新发送数据
     * 
     * retry(new BiPredicate<Integer, Throwable>):出现错误时,根据指定逻辑(可以捕获重发的次数和发生的错误)决定是否让被观察者重新发送数据
     * 
     * retry(long time,Predicate predicate) : 出现错误时,根据指定逻辑(可以捕获到发生的错误)决定是否让被观察者重新发送数据。并且有持续重发的次数限制
 

Observable.create(new ObservableOnSubscribe<Integer>() {
                    @Override
                    public void subscribe(ObservableEmitter<Integer> emitter) throws Exception {
                        emitter.onNext(1);
                        emitter.onNext(2);
                        emitter.onError(new Throwable("发生错误了"));
                        emitter.onNext(3);
                    }
                })
                .retry(new BiPredicate<Integer, Throwable>() {
                    @Override
                    public boolean test(Integer integer, Throwable throwable) throws Exception {
                        // interger 为重试次数 ,throwable 为捕获到的异常
                        Log.e(TAG + "retry", throwable.getMessage());
                        Log.e(TAG + "integer", "重试次数: " + integer);
                        //return true : 重新发送请求(若持续遇到错误,就持续重新发送)
                        //return false :    不重新发送数据 并且调用观察者的onError()方法结束
                        if (integer > 3)
                            return false;
                        return true;
                    }
                })
                .subscribe(new Observer<Integer>() {
                    @Override
                    public void onSubscribe(Disposable d) {

                    }

                    @Override
                    public void onNext(Integer integer) {
                        Log.e(TAG + "retry", String.valueOf(integer));
                    }

                    @Override
                    public void onError(Throwable e) {
                        Log.d(TAG, "onError");
                    }

                    @Override
                    public void onComplete() {
                        Log.d(TAG, "onComplete");
                    }
                });
2022-05-11 14:40:10.445 28810-28810/com.app.empty D/MainActivitydelay: start
2022-05-11 14:40:10.446 28810-28810/com.app.empty E/MainActivityretry: 1
2022-05-11 14:40:10.446 28810-28810/com.app.empty E/MainActivityretry: 2
2022-05-11 14:40:10.446 28810-28810/com.app.empty E/MainActivityretry: 发生错误了
2022-05-11 14:40:10.446 28810-28810/com.app.empty E/MainActivityinteger: 重试次数: 1
2022-05-11 14:40:10.446 28810-28810/com.app.empty E/MainActivityretry: 1
2022-05-11 14:40:10.446 28810-28810/com.app.empty E/MainActivityretry: 2
2022-05-11 14:40:10.446 28810-28810/com.app.empty E/MainActivityretry: 发生错误了
2022-05-11 14:40:10.446 28810-28810/com.app.empty E/MainActivityinteger: 重试次数: 2
2022-05-11 14:40:10.446 28810-28810/com.app.empty E/MainActivityretry: 1
2022-05-11 14:40:10.446 28810-28810/com.app.empty E/MainActivityretry: 2
2022-05-11 14:40:10.446 28810-28810/com.app.empty E/MainActivityretry: 发生错误了
2022-05-11 14:40:10.446 28810-28810/com.app.empty E/MainActivityinteger: 重试次数: 3
2022-05-11 14:40:10.446 28810-28810/com.app.empty E/MainActivityretry: 1
2022-05-11 14:40:10.446 28810-28810/com.app.empty E/MainActivityretry: 2
2022-05-11 14:40:10.446 28810-28810/com.app.empty E/MainActivityretry: 发生错误了
2022-05-11 14:40:10.446 28810-28810/com.app.empty E/MainActivityinteger: 重试次数: 4
2022-05-11 14:40:10.446 28810-28810/com.app.empty D/MainActivity: onError

7、subscribeOn / ObserverOn 操作符

* subscribeOn : 发送事件的线程
     * observerOn: 接收事件的线程
     * <p>
     * 线程调度器:
     * Schedulers.io(): 代表io操作的线程,通常用于网络,读写文件等io密集型的操作
     * Schedulers.compucation(): 代表CPU计算密集型的操作,例如需要大量计算的操作
     * Schedulers.newThread(): 代表一个常规的新线程
     * AndroidSchedulers。mainThread(): 代表Android的主线程

Observable.create(new ObservableOnSubscribe<String>() {
                    @Override
                    public void subscribe(ObservableEmitter<String> emitter) throws Exception {
                        emitter.onNext("事件");
                        Log.d(TAG + "subscribeOn_ObserverOn", "发送事件:" + Thread.currentThread().getName());
                    }
                })
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Consumer<String>() {
                    @Override
                    public void accept(String s) throws Exception {
                        Log.d(TAG + "subscribeOn_ObserverOn", "接收事件:   " + Thread.currentThread().getName());
                    }
                });

8、repeat() 操作符

* repeat操作符的作用是重复发射 observable的数据序列,可以使无限次也可以是指定次数.不传时为重复无限次

Observable.just(1, 2, 3)
                .repeat(3)
                .subscribe(new Consumer<Integer>() {
                    @Override
                    public void accept(Integer integer) throws Exception {
                        Log.d(TAG + "repeat", String.valueOf(integer));
                    }
                });

9、retryUntil() 操作符

* 发送事件遇到错误,指定规则是否重新发送。retry(Predicate predicate)。
     * 
     *  return true : 不重新发送请求,并且调用观察者的onError()方法结束
     *  return false : 重新发送数据(若持续遇到错误,就持续重新发送)

Observable.create(new ObservableOnSubscribe<Integer>() {
                    @Override
                    public void subscribe(ObservableEmitter<Integer> emitter) throws Exception {
                        emitter.onNext(1);
                        emitter.onNext(2);
                        emitter.onError(new Throwable("发生错误了"));
                        emitter.onNext(3);
                    }
                })
                .retryUntil(new BooleanSupplier() {
                    @Override
                    public boolean getAsBoolean() throws Exception {

                         //return true : 不重新发送请求,并且调用观察者的onError()方法结束
                        // return false : 重新发送数据(若持续遇到错误,就持续重新发送)
                        return false;
                    }
                })
                .subscribe(new Observer<Integer>() {
                    @Override
                    public void onSubscribe(Disposable d) {

                    }

                    @Override
                    public void onNext(Integer integer) {
                        Log.e(TAG + "retryUntil", String.valueOf(integer));
                    }

                    @Override
                    public void onError(Throwable e) {

                    }

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

10、 retryWhen() 操作符

* 遇到错误时,将发生的错误传递给一个新的被观察者(Observable),并决定是否需要重新订阅原始被观察者(Observable) & 发送事件

Observable.create(new ObservableOnSubscribe<Integer>() {
                    @Override
                    public void subscribe(ObservableEmitter<Integer> emitter) throws Exception {
                        emitter.onNext(1);
                        emitter.onNext(2);
                        emitter.onError(new Throwable("发送了错误"));
                        emitter.onNext(3);
                    }
                })
                //遇到Error时会回调
                .retryWhen(new Function<Observable<Throwable>, ObservableSource<?>>() {
                    @Override
                    public ObservableSource<?> apply(Observable<Throwable> throwableObservable) throws Exception {
                        return throwableObservable.flatMap(new Function<Throwable, ObservableSource<?>>() {
                            @Override
                            public ObservableSource<?> apply(Throwable throwable) throws Exception {

                                //1、若返回的Observable发送的事件 = Error ,则原始的Observable则不重新发送事件。该异常信息可在观察者的onError中获得
                                //return Observable.error(throwable);

                                //2、若返回的Observable发送的事件= Next事件(和next的内容无关),则原始的Observable重新发送事件(若持续遇到错误,则持续发送)
                                return Observable.just(5); //仅仅是作为一个触发重新订阅原被观察者的通知,什么数据并不重要,只有不是onComplete/onError事件
                            }
                        });

                    }
                })
                .subscribe(new Observer<Integer>() {
                    @Override
                    public void onSubscribe(Disposable d) {

                    }

                    @Override
                    public void onNext(Integer integer) {
                        Log.d(TAG + "retryWhen", String.valueOf(integer));
                    }

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

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


 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

又双㕛叕、

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

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

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

打赏作者

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

抵扣说明:

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

余额充值