IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> 七、RxJava异常处理onErrorReturnonErrorResumeNextonErrorResumeWithretry -> 正文阅读

[移动开发]七、RxJava异常处理onErrorReturnonErrorResumeNextonErrorResumeWithretry

1.项目地址

在MainActivity7

2.讲解

需要在emitter.onError里面执行抛异常,这样才能抛异常,不报错。如

emitter.onError(new IllegalAccessException("我要报错了,你小心点,哈哈哈!"));

1.onErrorReturn

这个报错后,下游不会接收到消息,可以发射一个错误提示给下游,如发射一个404

//        用emitter.onError抛出异常的话,上游(观察者)还是会执行完。onErrorReturn会使下游(观察者)暂停接收,然后还可以返回一个错误值(类似网络报错,返回一个404)
        Observable.create(new ObservableOnSubscribe<Integer>() {
            @Override
            public void subscribe(@NonNull ObservableEmitter<Integer> emitter) throws Throwable {
                for (int i = 0; i < 100; i++) {
                    if (i == 5) {
                        emitter.onError(new IllegalAccessException("我要报错了,你小心点,哈哈哈!"));
                    }
                    emitter.onNext(i);
                    Log.d(TAG, "subscribe: "+i);//这个还是会执行完
                }
                emitter.onComplete();
            }
        })
                .onErrorReturn(new Function<Throwable, Integer>() {
                    @Override
                    public Integer apply(Throwable throwable) throws Throwable {
                        Log.d(TAG, "apply: "+throwable.getMessage());
                        return 400;
                    }
                })
                .subscribe(new Observer<Integer>() {
            @Override
            public void onSubscribe(@NonNull Disposable d) {
                Log.d(TAG, "onSubscribe: ");
            }

            @Override
            public void onNext(@NonNull Integer integer) {
                Log.d(TAG, "onNext: "+integer);
            }

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

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

2.onErrorResumeNext

错误发射后,可以创建一个被观察者,可以继续发射emitter.onNext(400);

//这个是error报错了,然后会重新创建一个被观察者,然后又可以执行emitter.onNext
        Observable.create(new ObservableOnSubscribe<Integer>() {
            @Override
            public void subscribe(@NonNull ObservableEmitter<Integer> emitter) throws Throwable {
                for (int i = 0; i < 100; i++) {
                    if (i == 5) {
                        emitter.onError(new Error("错错错"));
                    }else {
                        emitter.onNext(i);
                        Log.d(TAG, "subscribe: "+i);//这个还是会执行完
                    }

                }
                emitter.onComplete();
            }
        })
                .onErrorResumeNext(new Function<Throwable, ObservableSource<? extends Integer>>() {
                    @Override
                    public ObservableSource<? extends Integer> apply(Throwable throwable) throws Throwable {
                        return Observable.create(new ObservableOnSubscribe<Integer>() {
                            @Override
                            public void subscribe(@NonNull ObservableEmitter<Integer> emitter) throws Throwable {
                                //只能执行两个
                                emitter.onNext(400);
                                emitter.onNext(400);
                                emitter.onNext(400);
                                emitter.onNext(400);
                                emitter.onNext(400);
                                emitter.onNext(400);
                                emitter.onComplete();
                            }
                        });
                    }
                })
                .subscribe(new Observer<Integer>() {
                    @Override
                    public void onSubscribe(@NonNull Disposable d) {
                        Log.d(TAG, "onSubscribe: ");
                    }

                    @Override
                    public void onNext(@NonNull Integer integer) {
                        Log.d(TAG, "onNext: "+integer);
                    }

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

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

3.onErrorResumeWith

感觉跟onErrorResumeNext差不多,可以继续发射

4.retry

表示报错后,重试。其中true表示重试,false表示不重试。一般都用true吧

Observable.create(new ObservableOnSubscribe<Integer>() {
            @Override
            public void subscribe(@NonNull ObservableEmitter<Integer> emitter) throws Throwable {
                for (int i = 0; i < 100; i++) {
                    if (i == 5) {
                        emitter.onError(new IllegalAccessException("错错错"));
                    }else {
                        emitter.onNext(i);
                        Log.d(TAG, "subscribe: "+i);//这个还是会执行完
                    }

                }
                emitter.onComplete();
            }
        })
                //一直重试
//                .retry()
                //重试一段时间后,再停止
//                .retry(new Predicate<Throwable>() {
//                    @Override
//                    public boolean test(Throwable throwable) throws Throwable {
//                        Log.d(TAG, "test: "+throwable.getMessage());
//                        return true;//false 代表不重试,true表示重试,一段时间后就是停止
//                    }
//                })
                //表示错误后,多少次重试,设置返回值是false的话,将不重试
//                .retry(3, new Predicate<Throwable>() {
//                    @Override
//                    public boolean test(Throwable throwable) throws Throwable {
//                        return true;
//                    }
//                })
                //重复很多次,打印重复的次数
                .retry(new BiPredicate<Integer, Throwable>() {
                    @Override
                    public boolean test(@NonNull Integer integer, @NonNull Throwable throwable) throws Throwable {
                        Thread.sleep(2);
                        Log.d(TAG, "test重试了: "+integer+"次"+throwable.getMessage());
                        return true;
                    }
                })
                .subscribe(new Observer<Integer>() {
                    @Override
                    public void onSubscribe(@NonNull Disposable d) {
                        Log.d(TAG, "onSubscribe: ");
                    }

                    @Override
                    public void onNext(@NonNull Integer integer) {
                        Log.d(TAG, "onNext: "+integer);
                    }

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

                    @Override
                    public void onComplete() {
                        Log.d(TAG, "onComplete: ");
                    }
                });
1.retry()

表示一直重试

2.retry(new Predicate()

表示重试一段时间后,再停止

3.retry(3, new Predicate()

表示可以设置重试的次数,这里设置为重试3次

4.retry(new BiPredicate<Integer, Throwable>()

重试多次,然后打印重试的次数

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2021-11-27 10:01:16  更:2021-11-27 10:03:15 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 5:55:06-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码