RxJava2学习笔记2

我们通常再retrofit里结合rxjava使用。请求的时候要显示一个loading动画,请求结束或者刷新或者加载更多结束,要取消这个动画,但是我们的回掉是三个方法,如果再每个方法都写,很麻烦,有没有更好的方法呢?学习2个do方法。

doOnSubscribe
subscribe时调用,默认执行在 subscribe() 发生的线程。一般用于执行一些初始化操作,可以控制线程。

测试决定doOnSubscribe的线程

                .observeOn(Schedulers.io())
                .doOnSubscribe(new Consumer() {
                    @Override
                    public void accept(@NonNull Disposable disposable) throws Exception {
                        System.out.println("doOnSubscribe=" + Thread.currentThread().getName());
                    }
                })
                .observeOn(Schedulers.single())

// doOnSubscribe=main
说明与observeOn无关。

再来

                .subscribeOn(Schedulers.io())
                .doOnSubscribe(new Consumer() {
                    @Override
                    public void accept(@NonNull Disposable disposable) throws Exception {
                        System.out.println("doOnSubscribe=" + Thread.currentThread().getName());
                    }
                })
               .subscribeOn(Schedulers.single())

//doOnSubscribe=RxSingleScheduler-1

结论:如果在 doOnSubscribe() 之后有 subscribeOn() 的话,它将执行在离它最近的 subscribeOn() 所指定的线程。

这个方法在Android种的应用:可以放show一个loading。那么为什么不在onSubscribe和onStart里呢,因为onSubscribe和onStart发生在Observable.create所在线程,并且onStart一开始就调用。

doFinally
结束时调用,默认执行在 subscribe() 发生的线程。一般用于执行一些结束操作,可以控制线程。

在请求结束onComplete或者onError之后。会走doFinally,他的线程是在上面最近的observeOn的线程决定的。

                .doFinally(new Action() {
                    @Override
                    public void run() throws Exception {
                        System.out.println("doFinally1" + Thread.currentThread().getName());

                    }
                })
                .observeOn(Schedulers.single())

// doFinally1main 默认在subscribe线程。

         .observeOn(Schedulers.io())
                .doFinally(new Action() {
                    @Override
                    public void run() throws Exception {
                        System.out.println("doFinally1" + Thread.currentThread().getName());

                    }
                })
                .observeOn(Schedulers.single())

//doFinally1RxCachedThreadScheduler-1 由上方最近的observeOn线程决定。

这个方法在Android种的应用:可以放取消loading。那么为什么不在onComplete和onError里呢,因为onComplete和onError发生在是互斥的,也就是如果走了onComplete就不会调用onError,2个方法都要写。

你可能感兴趣的:(RxJava2学习笔记2)