我们通常再retrofit里结合rxjava使用。请求的时候要显示一个loading动画,请求结束或者刷新或者加载更多结束,要取消这个动画,但是我们的回掉是三个方法,如果再每个方法都写,很麻烦,有没有更好的方法呢?学习2个do方法。
doOnSubscribe
subscribe时调用,默认执行在 subscribe() 发生的线程。一般用于执行一些初始化操作,可以控制线程。
测试决定doOnSubscribe的线程
.observeOn(Schedulers.io())
.doOnSubscribe(new Consumer<Disposable>() {
@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<Disposable>() {
@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个方法都要写。