如何完美隐藏Disposable的存储和销毁过程(一)


–致敬我目前最喜欢的语言Kt

又到了写我最最喜欢的RxJava的时刻了,写点函数式的操作,很多时候都能让我莫名其妙地high的不行!

今天来讲讲,在kt环境下,我到底是如何完美隐藏我的Disposable的创建和销毁过程的。

相信大家一定在开发的过程中遇到过这样的提示或者警告吧。

这个警告的意思就是,RxJava可能造成内存泄漏,你应该对Flowable的管道添加适当的处理,在该销毁的时机就给他销毁了。如果你心大一点,就直接加个@SuppressLint("CheckResult"),如果你心细一点,就在activity创建的时候创建一个CompositeDisposable来统一管理,然后在onDestroy时,调用其dispose()来统一对其管理的Disposable进行回收。

我,是一个极简主义者,我非常讨厌过多的大括号的嵌套,而且将Disposable添加到CompositeDisposable的操作真的非常无聊,之前一直希望通过函数式的方式来优雅地解决这个问题,但是在Java语言中我发现,这样做真的适得其反,反而让代码更加复杂,可读性更差。

但是当我尝试通过Kt来实现对应的操作,世界豁然开朗。

先看成品,这是我通过函数式的方式实现的断点下载功能。这是我从事Android开发以来,写出来最令我满意的代码了。

main_btn_down1.download(Constant.THUNDER_DOWNLOAD_FULL_URL) {main_progress1.max = it.total.toInt()main_progress1.progress = it.progress.toInt()
}
main_btn_cancel1.cancelDownload(Constant.THUNDER_DOWNLOAD_FULL_URL)

我所追求的完美的Activity就是让其完全致力于业务,与繁琐的具体完全脱钩,即Activity你只需要负责视图的绘制以及刷新,其余的逻辑不用你管。你看这里我为按钮指定了点击下载的逻辑,并为其设置需要下载的url路径,然后我就只需要接受请求结果并且更新进度条视图就行了。同理,取消按钮也是一样。

我常常对自己说,很多事情真的没有那么复杂,往往只需要解决三个哲学性问题就行了(社区的保安一定也常常在思考这些哲学性问题),大象装冰箱问题同理:

  1. 你是谁
  2. 你要去哪
  3. 你要干什么

从纯业务的角度来看不也就是这点事情吗?我作为View层,我为什么需要关心Disposable怎么处理?

那实现代码就应该非常简单,就拿下载结果来说

  1. 我是某个按钮:main_btn_down1
  2. 我想获取到这个地址的数据:download(Constant.THUNDER_DOWNLOAD_FULL_URL)
  3. 我想对返回数据进行分析:{ main_progress1.max = it.total.toInt() main_progress1.progress = it.progress.toInt() }

对不对?当我意识到这一点的时候,我真的感觉自己以前写的到底是什么?

那么这个到底是怎么实现的呢?且听下回分解。

如何完美隐藏Disposable的存储和销毁过程(一)相关推荐

  1. 如何完美隐藏Disposable的存储和销毁过程(二)

    如何完美隐藏Disposable的存储和销毁过程(二) 前面一节大致讲了讲,我们的成品到底是怎么样的?那么这一节,我们就来讲讲如何初步地隐藏自己Disposable的存储和销毁. 首先说说最常见的方式 ...

  2. 数据存储方式_寻找要操作数据的存储地址的过程称为寻址,几种寻址的方式分享...

    单片机工作时,在程序指令的控制下,对数据进行各种操作(如存取数据.对数据进行运算等),然后输出控制信号.指令要对数据进行操作,必须先找到操作的数据,数据存放在存储器中,只有找到要操作数据的存储地址,才 ...

  3. oracle表空间,角色,权限,表,索引,序列号,视图,同义词,约束条件,存储函数和过程,常用数据字典,基本数据字典信息,查看VGA信息,维护表空间,创建表空间等信息

    查看当前用户的缺省表空间 SQL>select username,default_tablespace from user_users; 查看当前用户的角色 SQL>select * fr ...

  4. Oracle数据库PL/SQL块-存储函数和过程

    PL/SQL块 PL/SQL程序由三个块组成,即声明部分.执行部分.异常处理部分 结构如下: declare​ /*声明部分,在此声明变量,类型及游标*/begin​ /*执行部分,过程及sql语句, ...

  5. emc存储java打开后报错,EMC存储划分lun过程

    下图是EMC存储系统示意图: 若将lun打散重建,需按以下步骤进行: 1. 在Storage Groups上点右键选择Select Luns,在打开的窗口中,将右边Selected Lun项下的lun ...

  6. EMC存储划分lun过程

    下图是EMC存储系统示意图: 若将lun打散重建,需按以下步骤进行: 1. 在Storage Groups上点右键选择Select Luns,在打开的窗口中,将右边Selected Lun项下的lun ...

  7. java 负数存储结构_负数在java中的存储和读取过程 | 学步园

    问题描述: 将-5存储在文本文件中,再读取出来显示到控制台; 预备知识: 1.在java中使用补码处理数字,而且byte(8)的数字在扩展成int(32)类型的时候,正数填充0,负数填充1; 2.负数 ...

  8. 深入理解HashMap的存储以及计算过程,提高HashMap使用效率

    原文地址:http://www.iteye.com/topic/539465 /**      *@author annegu      *@date 2009-12-02      */ Hashm ...

  9. emc CX存储更换硬盘过程

    EMC CX存储一般在二种情况下需要换盘,一为硬盘已经损坏(亮黄灯),二为频繁报DIsk soft media error错误,第一种情况很简单,直接去现场热拔插换硬盘即可,第二种情况其实硬盘还没有硬 ...

最新文章

  1. 脑电图伪迹去除方法汇总
  2. 商汤作价1026亿IPO,商业化汤教授身家220亿
  3. SAP收货时自动创建采购订单
  4. 报表没完没了怎么办? | 润乾集算器提效报表开发
  5. OxyPlot 导出图片及 WPF 元素导出为图片的方法
  6. HTML5与HTML4的比较
  7. 动态规划 —— 背包问题 P01 —— 0-1背包
  8. Outh2协议有哪四种授权模式?
  9. kettle系列-6.kettle实现多字段字典快速翻译
  10. serversocket 返回浏览器图片_深入理解浏览器的缓存机制
  11. 这十大挑战,摆在DL面前:马库斯长文质疑深度学习
  12. 力扣题目——103. 二叉树的锯齿形层序遍历
  13. python能做什么-python能用来做什么?这3大主要用途你一定要知道!(实用)
  14. mod_expires和mod_deflate的配置
  15. 实验一 组合逻辑电路的设计与测试
  16. 武汉加油!爬取百度迁徙地图数据+城市出行强度
  17. Matlab中散点图绘制详细教程scatter函数(附matlab代码)
  18. 空间索引 - Redis/MongoDB/PostgreSQL/MySQL空间索引使用报告
  19. reset按钮失效,不能清空输入框
  20. 计算机调节音量找不到,电脑右下角的小喇叭不见了?教你这样操作,轻松调节音量!...

热门文章

  1. python datasets_python基础之sklearn.datasets
  2. js判断浏览器是否支持webGL
  3. 机器人简化图画手绘图_床上用的扫地机器人,彻底清除细菌,不再担心酒店卫生问题...
  4. Nginx + FastCGI 程序(C/C++) 搭建高性能web service的Demo及部署发布
  5. java开发需要掌握哪些东西_java开发需要掌握哪些技能
  6. ffmpeg rtmp 封装发送函数_FFmpeg发送流媒体的命令(UDP,RTP,RTMP)
  7. java等号_java等号
  8. mysql安装后第一次操作_MySQL数据库之mysql 安装成功以及第一次安装成功初始化密码操作...
  9. 【深度学习】新的深度学习优化器探索(协同优化)
  10. 【深度学习入门到精通系列】特别正经的合理调参介绍~❤️