现在很多项目都在使用Rxjava了,对于RxJava的使用,估计都很熟悉了,但是很多人在使用RxJava的时候容易产生内存泄漏问题,比如我们在用RxJava配合Retrofit的时候,发出请求出去,拿到数据后我们可能会去刷新界面,但是如果这时候网络比较差,返回比较慢,而我们的Activity这时候关闭了,那RxJava当拿到返回的数据的时候去刷新界面就会报空指针异常了。所以我们当Activity关闭的时候,我们这时候如果RxJava还没执行完,我们应该取消订阅。
常用的主要三种方式:(按照推荐从低到高来介绍)
本文主要讲自带取消订阅方式。
在RxJava1的时候我们知道在你用Observable执行时候会返回一个Subscription类:
Subscriptionsubscription=Observable.xxx("yy").subscribe(.....);然后我们只需要在我们界面的ondestory方法中对这个对象进行取消订阅操作就可以:
而RxJava2换了方式,但是基本方法是一模一样的,只是换成了Disposable:
如果我们使用的是Consumer,那和原来RxJava1是一样的操作:
但是很多人会说难道不能和RxJava1的方式差不多,因为很多项目已经按照RxJava1的方式来封装了进行相应的取消订阅代码,直接换成RxJava2方式变化不一样了,能不能变得和Rxjava1取消订阅方式差不多。答案是当然可以。
我们可以使用DisposableObserver和subscribeWith二者结合来做的和Rxjava1一样的方式来取消订阅。
DisposableObserver是一个抽象的Observer,它通过实现了Disposable接口允许异步取消。
所以我们初步代码可以变为:
我在看很多一些开源项目中,有些人一个界面的上会有多个订阅(比如有多个网络接口请求),这时候我们需要批量取消订阅,有些人会写一个ArrayList,然后把这些上面我们返回的DisposableObserver对象加入到ArrayList中,然后当我们的界面关闭的时候,再遍历ArrayList,把里面的元素取出来一个个取消订阅。实际上RxJava2中有替我们考虑到这个需求。那便是CompositeDisposable类。
CompositeDisposablecompositeDisposable=newCompositeDisposable();//批量添加compositeDisposable.add(observer1);compositeDisposable.add(observer2);compositeDisposable.add(observer2);//最后一次性全部取消订阅compositeDisposable.dispose();
我们以Activity为例:
publicclassRxManager{privateCompositeDisposablecompositeDisposable=newCompositeDisposable();publicvoidadd(Disposabled){compositeDisposable.add(d);}publicvoidclear(){compositeDisposable.dispose();}}