关于disposable

Disposable类

  • dispose():主动解除订阅
  • isDisposed():查询是否解除订阅 true 代表 已经解除订阅

rxjava虽然好用,但是总所周知,容易造成内存泄漏。也就说在订阅了事件后没有及时取阅,导致在activity或者fragment销毁后仍然占用着内存,无法释放。而disposable便是这个订阅事件,可以用来取消订阅。但是在什么时候取消订阅呢?我知道有两种方式:

  • 使用CompositeDisposable
    看源码,CompositeDisposable的介绍很简单

A disposable container that can hold onto multiple other disposables and offers O(1) add and removal complexity.

一个disposable的容器,可以容纳多个disposable,添加和去除的复杂度为O(1)。
这里需要注意的是在该类的addAll方法有这么一句注释

Atomically adds the given array of Disposables to the container or disposes them all if the container has been disposed

也就是说,如果这个CompositeDisposable容器已经是处于dispose的状态,那么所有加进来的disposable都会被自动切断。

所以说可以创建一个BaseActivity,用CompositeDisposable来管理订阅事件disposable,然后在acivity销毁的时候,调用compositeDisposable.dispose()就可以切断所有订阅事件,防止内存泄漏。

CompositeDisposable类

1、可以快速解除所有添加的Disposable类.
2、每当我们得到一个Disposable时就调用CompositeDisposable.add()将它添加到容器中, 在退出的时候, 调用CompositeDisposable.clear() 即可快速解除.

案例代码如下:

CompositeDisposable compositeDisposable=new CompositeDisposable();
Observable.create(new ObservableOnSubscribe<Integer>() {@Overridepublic void subscribe(ObservableEmitter<Integer> emitter) throws Exception {emitter.onNext(1);emitter.onComplete();或者 emitter.onError(new Throwable("O__O "));}}).subscribe(new Observer<Integer>() {private Disposable mDisposable;@Overridepublic void onSubscribe(Disposable d) {<!-- 订阅   -->mDisposable = d;<!-- 添加到容器中 -->compositeDisposable.add(d);}@Overridepublic void onNext(Integer value) {<!-- 判断mDisposable.isDisposed()如果解除了则不需要处理 -->}@Overridepublic void onError(Throwable e) {}@Overridepublic void onComplete() {}});<!-- 解除所有订阅者 -->
compositeDisposable.clear();
  • 在oError和onComplete后调用disposable.dispose();,也就是上面我给的例子中的方法。
    查看源码,ObservableCreate的静态类CreateEmitter就是这种方式实现的。同时也可以看到,onError和onComplete不可以同时调用的原因:每次掉用过onError或onComplete其中一个方法后,就会掉用dispose()方法,此时订阅取消,自然也就不能掉用另一个方法了
new Observer<Integer>() {private Disposable mDisposable;private int i;@Overridepublic void onSubscribe(Disposable d) {Log.d(TAG, "subscribe");mDisposable = d;}@Overridepublic void onNext(Integer value) {Log.d(TAG, "onNext: " + value);i++;if (i == 2) {Log.d(TAG, "dispose");mDisposable.dispose();Log.d(TAG, "isDisposed : " + mDisposable.isDisposed());}}@Overridepublic void onError(Throwable e) {Log.d(TAG, "error");}@Overridepublic void onComplete() {Log.d(TAG, "complete");}}

Rxjava2关于Disposable你应该知道的事相关推荐

  1. java disposable_Rxjava关于Disposable你应该知道的事

    关于disposable Disposable类 dispose():主动解除订阅 isDisposed():查询是否解除订阅 true 代表 已经解除订阅 rxjava虽然好用,但是总所周知,容易遭 ...

  2. APP推广前,你应该知道的事

    前言:随着中国互联网渗透率的逐步提高,中国广告主的广告投放重心逐渐向互联网迁移.互联网广告投放占比上升趋势明显.调查表明,随着用户逐步向移动端迁徙,广告主也正快速接受甚至追捧移动广告,广告主在移动端的 ...

  3. 比尔·盖茨:关于新冠疫苗你需要知道的事

    这些天我被问得最多的一个问题是:世界何时才能回到去年12月新冠病毒大流行之前的状态?我的答案始终如一:当我们得到一种近乎完美的特效药的时候,或者当地球上几乎所有人都接种了新冠疫苗的时候. 前者不太可能 ...

  4. 产品经理面试必须知道的事

    最近"产品经理面试太难了吧!"这句话一直在我耳边缠绕.其实我觉得还好吧,我只会觉得你可能是没技巧.下面金老师给大家分享一下字节跳动产品经理招聘的面试干货. 应该没有人不知道字节跳动 ...

  5. 大数据软件的真假分辨,消费者一定要知道的事!

    大数据软件的真假分辨,消费者一定要知道的事! 大数据时代,各种各样的新东西出现,让大家的生活都变的更便利,快捷了.但是一个新的好东西的出现,势必会引来大量的不良商家开始争相模仿.恶意竞争,打乱了市场动 ...

  6. “真希望我第一次创业时就知道的事”

    我们常常事后诸葛亮.当你回头看看之前做过的项目或努力,你总能更好地意识到什么事重要.什么事不重要. 在创业上也是一样的.在一项事业上奋斗了一两年或更多的时间后,你总能更好地意识到一些事是值得担心的,而 ...

  7. eBay跨境电商建议指南:eBay开店之前你就该知道的事

    做eBay跨境电商的卖家千千万万,到底要怎么做才能在这个平台大卖呢?这是东哥最近私信很多人都在问的一个问题,东哥作为eBay老鸟,不得不说在这个问题上真的有很多建议想跟新手卖家们提一提.所以今天东哥的 ...

  8. 入门深度学习?这里有5件你应该知道的事

    作者|PURVA HUILGOL 编译|Flin 来源|analyticsvidhya 开始你的深度学习生涯? 对于新手来说,深度学习是一个复杂而令人生畏的领域.像隐藏层.卷积神经网络.反向传播等概念 ...

  9. 串口,com口,ttl,max232你应该知道的事

    1 今天,说几个比较基础的知识,大家在开发过程中经常会遇到但是又不是特别注意的知识点. TTL电平: TTL是Transistor-Transistor Logic,即晶体管-晶体管逻辑的简称,它是计 ...

最新文章

  1. netmiko 自动判断设备类型python_Python模块-Netmiko入门
  2. cannot create file怎么解决_内核问题解决方法记录
  3. led灯条维修_常见的LED透明屏型号规格,影响LED透明屏价格因素
  4. python包里面的dll是什么_Python中的包ImportError
  5. python获取数组中最多的元素
  6. PPRevealSideViewController
  7. 开源跳板机(堡垒机)Jumpserver v0.3.0 发布
  8. vscode工作区是什么意思_空压机的容积流量和工作压力是什么意思?
  9. 每天一杯C_Visual Studio各个版本的区别和总结
  10. android 底部弹窗失效,Android实现从底部弹出Dialog(和PopWindow实现的效果同样)
  11. 对学生朋友的一点建议
  12. Eclipse配置中文(汉化)
  13. 概率论与数理统计-读书笔记3
  14. 独家|神秘SDK暗刷百度广告 植入数千款APP
  15. 手机电脑同连一个wf,手机网速比电脑网速快很多,电脑网速很慢
  16. Latex表格内容自动换行
  17. 金融行业基于 DELL EMC 高端存储的核心系统实践经验分享
  18. java 字符串4%3e=3,gson 生成的json字符串带\u003c,\u003d,\u003e的解决方案
  19. jquery 3D旋转效果
  20. MATLAB有限元二维编程(三角单元)

热门文章

  1. 电脑版永恒纪元服务器正在维护,永恒纪元————【维护】12月7日更新维护公告...
  2. SSH配置:Hibernate的packagesToScan路径解析分析
  3. 用Python实现斐波那契(Fibonacci)函数
  4. Windchill的历史
  5. 黑猴子的家:Ubuntu下载
  6. MongoDB快速上手,聊聊这款火了一阵又销声匿迹的非关系型数据库
  7. VS2010 MFC TextOut垂直显示内容的显示、清除和修改
  8. 正睿OI补题(排序,高精度)
  9. 基于51单片机汽车胎压温度监测报警系统(程序+仿真+原理图+元件清单)
  10. Windows 10下Linux开发环境搭建