
Android技能树 — Rxjava取消订阅小结(1):自带方式
1. 自带取消订阅方式:
在RxJava 1的时候我们知道在你用Observable执行时候会返回一个Subscription类:
然后我们只需要在我们界面的ondestory方法中对这个对象进行取消订阅操作就可以:
我们可以看到很简单,这样当我们Activity关闭的时候已经自动取消了订阅。
而RxJava2换了方式,但是基本方法是一模一样的,只是换成了Disposable:
如果我们使用的是Consumer,那和原来RxJava 1 是一样的操作:
但是我们可能更多的是使用Observer等,那这时候subscrbe(observer)返回的是void,所以不能像上面一样操作,需要下面代码所示那样:
和RxJava 1 最大的区别主要是获取这个取消订阅对象的地方不同,Disposable是在Observer里面的onSubscribe方法的参数拿到,然后我们可以定义一个临时变量进行赋值,然后在需要取消订阅的地方去调用即可。
但是很多人会说难道不能和RxJava 1 的方式差不多,因为很多项目已经按照RxJava 1 的方式来封装了进行相应的取消订阅代码,直接换成RxJava 2 方式变化不一样了,能不能变得和Rxjava 1 取消订阅方式差不多 。答案是当然可以。
我们可以使用DisposableObserver和subscribeWith二者结合来做的和Rxjava 1 一样的方式来取消订阅。
1.1 DisposableObserver
DisposableObserver 是一个抽象的 Observer, 它通过实现了 Disposable 接口允许异步取消。
我们可以看到,这个DisposableObserver即实现了Observer,又实现了Disposable接口。
PS : DisposableObserver源码里面有个AtomicReference,有些人也许不知道这个类,可以初步理解为加了锁,方便多线程操作。具体可以看文章Java之美[从菜鸟到高手演练]之atomic包的原理及分析
所以我们初步代码可以变为:
1.2 subscribeWith
我们可以看到 subscribeWith订阅的源码是把Observer对象同时返回,正好配合上面的DisposableObserver:
这下是不是和我们RxJava 1 里面的写法一模一样了。
1.3 CompositeDisposable
我在看很多一些开源项目中,有些人一个界面的上会有多个订阅(比如有多个网络接口请求),这时候我们需要批量取消订阅,有些人会写一个ArrayList,然后把这些上面我们返回的DisposableObserver对象加入到ArrayList中,然后当我们的界面关闭的时候,再遍历ArrayList,把里面的元素取出来一个个取消订阅。实际上RxJava 2 中有替我们考虑到这个需求。那便是CompositeDisposable类。
2. 配合MVP做封装:
我们以Activity为例:
比如我们在BaseFrameActivity里面传入了p 和 m 的泛型,我们需要动态实例化,当然你也可以用Dagger2等,比如我们是用反射:
我们来看BasePresenter.java:
我们把Observable等取消订阅操作放在了RxManager里面了:
最终比如我们要用自己的Activity了:
只需要继承BaseFrameActivity,然后把要实例化的P和M对象传入:
直接就可以使用mPresenter执行相关操作,并且mPresenter实例化的时候也已经实例化一个RxManager实例对象。
假设我们用的是最原始的Observer来订阅:
然后Activity销毁时候,会自己去帮你取消订阅。
作者:青蛙要fly
