我的RxJava 学习之旅 五

onErrorReturn : 处理Observable中的onError事件(自己消化掉)并返回一个自己设定的数据

public static void test24(){
        Observable.create(new Observable.OnSubscribe<Integer>() {
            @Override
            public void call(Subscriber<? super Integer> subscriber) {
                subscriber.onNext(1);
                subscriber.onNext(2);
                subscriber.onError(new NullPointerException("......"));
                subscriber.onNext(3);
            }
        }).onErrorReturn(new Func1<Throwable, Integer>() {
            @Override
            public Integer call(Throwable throwable) {
                return 10;
            }
        }).subscribe(new Action1<Integer>() {
            @Override
            public void call(Integer integer) {
                Log.v(TAG, "...call = " + integer);
            }
        });
    }

onErrorResumeNext/onExceptionResumeNext: 当第一个Observable发生错误时 就会调用第二个Observable

public static void test25(){
        Observable.create(new Observable.OnSubscribe<Integer>() {
            @Override
            public void call(Subscriber<? super Integer> subscriber) {
                subscriber.onNext(1);
                subscriber.onNext(2);
                subscriber.onError(new NullPointerException("......"));
                subscriber.onNext(3);
            }
        }).onErrorResumeNext(new Func1<Throwable, Observable<? extends Integer>>() {
            @Override
            public Observable<? extends Integer> call(Throwable throwable) {
                Observable<Integer> integerObservable = Observable.create(new Observable.OnSubscribe<Integer>() {
                    @Override
                    public void call(Subscriber<? super Integer> subscriber) {
                        subscriber.onNext(4);
                        subscriber.onNext(5);
                    }
                });
                return integerObservable;
            }
        }).subscribe(new Action1<Integer>() {
            @Override
            public void call(Integer integer) {
                Log.v(TAG, "...call = " + integer);
            }
        });
    }

retry:如果原始的Observable发生错误,retry是从新订阅关系

public static void test27(){
        Observable.create(new Observable.OnSubscribe<Integer>() {
            @Override
            public void call(Subscriber<? super Integer> subscriber) {
                subscriber.onNext(1);
                subscriber.onNext(2);
                subscriber.onError(new NullPointerException("......"));
                subscriber.onNext(3);
            }
        })
                .retry(3) // 重复订阅三次
                .subscribe(new Observer<Integer>() {
                    @Override
                    public void onCompleted() {

                    }

                    @Override
                    public void onError(Throwable e) {
                        Log.v(TAG, "...call = " + e.getLocalizedMessage());
                    }

                    @Override
                    public void onNext(Integer integer) {
                        Log.v(TAG, "...call = " + integer);
                    }
                });
    }

类似的函数还有 :

Javadoc: retry()) ⽆论收到多少次onError通知,都会继续订阅并发射原始Observable。

Javadoc: retry(long)) retry会最多重新订阅指定的次数,如果次数超了,不会尝试再次订阅

Javadoc: retry(Func2)

retryWhen

subscribe/observerOn: 指定被观察者和观察者运行的线程

public static void test28() {
        Observable.create(new Observable.OnSubscribe<String>() {
            @Override
            public void call(Subscriber<? super String> subscriber) {
                subscriber.onNext("test 28");
                Log.v(TAG, "...test = " +Thread.currentThread().getName());
            }
        })
                .subscribeOn(Schedulers.io()) // 指定被观察者线程
                .observeOn(AndroidSchedulers.mainThread()) // 指定观察者线程
                .subscribe(new Action1<String>() {
                    @Override
                    public void call(String s) {
                        Log.v(TAG, "...call = " +Thread.currentThread().getName());
                    }
                });
    }

worker

public static void test29(){
        final Scheduler.Worker worker = Schedulers.io().createWorker(); // 创建调度器
        worker.schedule(new Action0() {
            @Override
            public void call() {
                Log.v(TAG, "...call = " +Thread.currentThread().getName());
                worker.unsubscribe(); // 避免内存浪费 回收
            }
        });
    }

delaySubscription: 延迟订阅

public static void test30() {
        Observable.create(new Observable.OnSubscribe<String>() {
            @Override
            public void call(Subscriber<? super String> subscriber) {
                subscriber.onNext("Android");
                subscriber.onNext("java");
                subscriber.onNext("python");
            }
        })
               .delaySubscription(2,TimeUnit.SECONDS)
                .subscribe(new Action1<String>() {
                    @Override
                    public void call(String s) {
                        Log.v(TAG, "...call = " + s);
                    }
                });
    }

doOnEach: Observable每发送一个数据就会调用它

public static void test31() {
        Observable.just(1,2,3)
                .doOnEach(new Observer<Integer>() {
                    @Override
                    public void onCompleted() {

                    }

                    @Override
                    public void onError(Throwable e) {

                    }

                    @Override
                    public void onNext(Integer integer) {
                        Log.v(TAG, "...onNext = " + integer);
                    }
                }).subscribe(new Action1<Integer>() {
            @Override
            public void call(Integer integer) {
                Log.v(TAG, "...call = " + integer);
            }
        });
    }
doOnNext:  和上面的一样
public static void test32() {
        Observable.just(1,2,3)
                .doOnNext(new Action1<Integer>() {
                    @Override
                    public void call(Integer integer) {
                        Log.v(TAG, "...doOnNext = " + integer);
                    }
                })
                .subscribe(new Action1<Integer>() {
                    @Override
                    public void call(Integer integer) {
                        Log.v(TAG, "...call = " + integer);
                    }
                });
    }

doOnSubscribe: 当被观察者被订阅的时候调用

public static void test33() {
        Observable.just(1,2,3)
                .doOnSubscribe(new Action0() {
                    @Override
                    public void call() {
                        Log.v(TAG, "...doOnSubscribe...... "); //先打印这句
                    }
                })
                .subscribe(new Action1<Integer>() {
                    @Override
                    public void call(Integer integer) {
                        Log.v(TAG, "...call = " + integer); // 后打印
                    }
                });
    }

doOnUnSubscribe : 什么时候取消订阅

public static void test34() {
        Observable.create(new Observable.OnSubscribe<Integer>() {
            @Override
            public void call(Subscriber<? super Integer> subscriber) {
                subscriber.onNext(1);
                subscriber.onNext(2);
                subscriber.onCompleted(); // 当调用onCompleted方法时 取消订阅关系
                subscriber.onNext(3);
                subscriber.onCompleted();
            }
        })
                .doOnUnsubscribe(new Action0() { // 当系统取消订阅关系时 调用这个方法
                    @Override
                    public void call() {
                        Log.v(TAG, "...doOnUnsubscribe... ");
                    }
                })
                .subscribe(new Action1<Integer>() {
            @Override
            public void call(Integer integer) {
                Log.v(TAG, "...call = " + integer);
            }
        });

    }

log:


如果使用 unSafeSubscribe,那么即使调用了onCompleted方法 也不会解除订阅关系

public static void test34() {
        Observable.create(new Observable.OnSubscribe<Integer>() {
            @Override
            public void call(Subscriber<? super Integer> subscriber) {
                subscriber.onNext(1);
                subscriber.onNext(2);
                subscriber.onCompleted();
                subscriber.onNext(3);
                subscriber.onCompleted();
            }
        })
                .doOnUnsubscribe(new Action0() { // 当系统取消订阅关系时 调用这个方法
                    @Override
                    public void call() {
                        Log.v(TAG, "...doOnUnsubscribe... ");
                    }
                })
                .unsafeSubscribe(new Subscriber<Integer>() {
                    @Override
                    public void onCompleted() {

                    }

                    @Override
                    public void onError(Throwable e) {

                    }

                    @Override
                    public void onNext(Integer integer) {
                        Log.v(TAG, "...call = " + integer);
                    }
                });

    }

seralize:

public static void test34() {
        Observable.create(new Observable.OnSubscribe<Integer>() {
            @Override
            public void call(Subscriber<? super Integer> subscriber) {
                subscriber.onNext(1);
                subscriber.onNext(2);
                subscriber.onCompleted();
                subscriber.onNext(3);
                subscriber.onCompleted();
            }
        })
                .serialize() // 只要调用了onCOmpleted方法 那么即使没有取消订阅 onCompleted后的数据也不会执行了
                .doOnUnsubscribe(new Action0() { // 当系统取消订阅关系时 调用这个方法
                    @Override
                    public void call() {
                        Log.v(TAG, "...doOnUnsubscribe... ");
                    }
                })
                .unsafeSubscribe(new Subscriber<Integer>() {
                    @Override
                    public void onCompleted() {

                    }

                    @Override
                    public void onError(Throwable e) {

                    }

                    @Override
                    public void onNext(Integer integer) {
                        Log.v(TAG, "...call = " + integer);
                    }
                });

    }

timeOut: 设置发送数据的时间

 public static void test35() {
        Observable
                .interval(2,TimeUnit.SECONDS)
                .timeout(2,TimeUnit.SECONDS)  // 可用于网络请求时候的设置
                .subscribe(new Action1<Long>() {
                    @Override
                    public void call(Long aLong) {
                        Log.v(TAG, "...call = " + aLong);
                    }
                }, new Action1<Throwable>() {
                    @Override
                    public void call(Throwable throwable) {
                        Log.v(TAG, "...call = " + throwable);
                    }
                });
    }

using:

public static void test36() {
       /* using(Func0,Func1,Action1)操作符接受三个参数:
        1. ⼀个⽤于创建⼀次性资源的⼯⼚函数
        2. ⼀个⽤于创建Observable的⼯⼚函数
        3. ⼀个⽤于释放资源的函数*/

        Observable.using(new Func0<String>() {
            @Override
            public String call() {
                return "Hello android";
            }
        }, new Func1<String, Observable<String>>() {
            @Override
            public Observable<String> call(String s) {
                return Observable.just(s);
            }
        }, new Action1<String>() {
            @Override
            public void call(String s) {
                Log.v(TAG, "...清理资源 = " );
                s = null;
            }
        })
                .subscribe(new Observer<String>() {
                    @Override
                    public void onCompleted() {
                        Log.v(TAG, "...onCompleted = " );
                    }

                    @Override
                    public void onError(Throwable e) {

                    }

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

    }

buffer: 数据缓存发送

 public static void test37() {
        // buff就是将发送的数据进行缓存 缓存长度由自己设置 达到缓存长度后就进行统一发送
        // 如果被观察者和观察者不在同一线程 可能会发送数据丢失的情况
        Observable<List<String>> buffer = Observable.just("1", "2", "3")
                .buffer(2);
        buffer.subscribe(new Action1<List<String>>() {
            @Override
            public void call(List<String> strings) {
                Log.v(TAG, "...,....................");
                for (int i = 0; i < strings.size(); i++) {
                    Log.v(TAG, "...call.. = " + strings.get(i));
                }
            }
        });


    }

window: 功能和buffer差不多,不同的是将一个Observable拆分成多个Observable

public static void test38() {
    
        Observable<Observable<String>> window = Observable.just("1", "2", "3").window(2);
        window.subscribe(new Action1<Observable<String>>() {
            @Override
            public void call(Observable<String> stringObservable) {
                stringObservable.subscribe(new Action1<String>() {
                    @Override
                    public void call(String s) {
                        Log.v(TAG, "...call.. = " + s);
                    }
                });
            }
        });
    }

map:Observable的数据转换 这里转换的只是对象里面的数据值而已 并不能转换对象类型

public static void test39() {
        ArrayList<Student> students = new ArrayList<>();
        students.add(new Student("张三",17));
        students.add(new Student("李四",17));
        students.add(new Student("张6",17));
        Observable.from(students)
                .map(new Func1<Student, Student>() {
                    @Override
                    public Student call(Student student) {
                        if (student.name.equals("李四"))
                        {
                            student.name = "hahah";
                        }
                        return student;
                    }
                }).subscribe(new Action1<Student>() {
            @Override
            public void call(Student student) {
                Log.v(TAG, "...call.. = " + student.name);
            }

        });
    }

flatMap: 转换发送数据对象

public static void test40() {
        ArrayList<Student> students = new ArrayList<>();
        students.add(new Student("张三",17));
        students.add(new Student("李四",17));
        students.add(new Student("张六",17));
        students.add(new Student("张一",12));
        students.add(new Student("张二",11));
        students.add(new Student("张五",10));
        Observable.from(students)
                .flatMap(new Func1<Student, Observable<LittleStudent>>() {
                    @Override
                    public Observable<LittleStudent> call(Student student) {
                        if (student.age < 15)
                        {
                            return Observable.just(new LittleStudent(student.name,student.age));
                        }
                        return null;
                    }
                })
                .subscribe(new Action1<LittleStudent>() {
                    @Override
                    public void call(LittleStudent littleStudent) {
                        Log.v(TAG, "...call.. = " + littleStudent.name);
                    }
                });

    }

这里可以发现 flatMap把发送的数据类型由Student--->LittleStudent 

merge: 合并Observable

 public static void test41() {
        Observable<Integer> ob = Observable.just(1, 3, 5);
        Observable<Integer> observable = Observable.just(2, 4, 6);
        Observable.merge(ob,observable)
                .subscribe(new Action1<Integer>() {
                    @Override
                    public void call(Integer integer) {
                        Log.v(TAG, "...call.. = " + integer);
                    }
                });

    }

startWith: 可以在Observable发送之前的准备工作/(如果你想⼀个Observable发射的数据末尾追加⼀个数据序列可以使⽤Concat操作符。

Observable<String> o1 = Observable.just("模拟⽹络请求");
Observable<String> o2 = o1.startWith("⽹络请求之前的准备⼯作");
o2.subscribe(new Action1<String>() {
 @Override
 public void call(String value) {
 Log.i(TAG, value);
 }
});

zip: 两个Observable的压缩,具体算法看Func  假设被观察者o1发送的数据为1 2 ,被观察者o2发送的数据为3,4,5。那么zip压缩发送的数据个数以最低个也就是2个为准。

public static void test42() {
        Observable<Integer> ob = Observable.just(1, 3, 5);
        Observable<Integer> observable = Observable.just(2, 4, 6);
        Observable.zip(ob, observable, new Func2<Integer, Integer, Integer>() {
            @Override
            public Integer call(Integer integer, Integer integer2) {
                return integer - integer2;
            }
        })
                .subscribe(new Action1<Integer>() {
                    @Override
                    public void call(Integer integer) {
                        Log.v(TAG, "...call.. = " + integer);
                    }
                });


    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

plx_csdn

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

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

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

打赏作者

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

抵扣说明:

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

余额充值