一. 前言
在正式开始RxJava讲解之前,我想把为什么要学习RxJava,以及学习RxJava之前需要用到的前置知识讲清楚。以终为始,我们一定要知道为什么要学它,知道学了它之后能做什么,这样才能激发学习的兴趣,技术才能真正有所成长!
在本节,不会涉及任何代码,我会尽力以通俗易懂的方式将概念以大白话的形式说清楚
话不多说,直接开始吧!
二. 我们为什么要学RxJava?
想问大家一个问题,为什么我们要学习RxJava呢?可能大家会这样回答
”因为别人都在学。。。“
”因为公司在用。。。“
”因为闲着没事。。。“
听起来都很有道理,但我认为都缺乏了人主观能动性的思考,这些理由都是别人做了什么我才做,而不是基于自己的思考后做的决定。那么何为自己的思考呢?
在这里,我认为就是对RxJava的思考,它到底有哪些好处?它代表了一种什么样的编程思维?它在工作中能怎样为我们提供便利?基于它的原理,我们在写代码的时候可以有哪些借鉴?
按照这个思路,我认为可以先从RxJava中的Rx说起
1. Rx是个什么玩意儿?
或许大家都知道,不只有RxJava,还有RxKotlin、RxJS等库,他们都有一个Rx前缀,那么这个Rx到底是什么意思呢?
据资料显示,Rx全称为“Reactive Extensions”,即“响应式扩展”。问题又来了,“扩展”好理解,相当于是“增强”之类的含义,但”响应式“是什么意思呢?
2. 响应式是什么意思?
其实响应式,在这里代表的是“响应式编程”。响应式编程,与“命令式编程”、“函数式编程”等一样,其实就是一种编程模式,在这里,我们需要理解下这种编程模式的核心思想是什么?
我查阅了大量资料,看了很多通俗易懂的解说,也看了很多晦涩难懂的释义,提炼成一句话,我认为响应式编程的核心思想就是
基于异步事件来驱动事务 !
你是不是有点懵?好的不急,让我来一个个地解释
异步: 这个好理解,就是多线程的那些事儿。但是为什么在这里只说了异步呢?同步可不可以?答案是可以的,像RxJava这种框架,当然可以处理同步事件,只是它更强调异步,所以我们没有提同步,而是说了异步。
事件: 类比Android中的“点击事件”,“滑动事件”,就是“有事儿了”
事务: 这里需要着重解释下,这是我在这里创的一个概念,和数据库中的事务,概念不同!这里的事务,可以理解为,一系列事件的集合。
看了这些解释,你肯定比刚刚要清楚一些了,但可能还是不完全懂,还是比较懵,不着急,让我来举个例子
假如说,有一位朋友要来你家吃饭,你要招待他。但你朋友没说具体几点来,可能11点半,也可能12点?OK,那么你有两种选择
一是隔一分钟就去门口楼道看一眼你朋友来了没
二是该做啥做啥,等你朋友来了,你朋友会敲门,然后你就正常开门接待就可以
这个我相信大家都会选择第二种方式,因为这种方式很自然,不耗费你过多的无效精力,你可以在这期间做任何你自己的事情,等朋友来了,自然会通知到你,你在收到“你朋友来了”这个事件的时候,进行下一步处理,也就是招待,就好了。
这个例子,很好理解吧?很开心地告诉你,响应式编程的核心思想,就蕴藏在这个例子里面!你或许还一知半解,让我来解读一下,你就明白了。
异步:你和你的朋友,是两个人,是两个线程!你们可以同时做不同的事情。
事件:但你们可能终会有一个交集,比如你的朋友来你家敲门,这相当于是一个事件,而且是不同的线程发来的事件,相当于是异步事件!
事务:你在收到你朋友发来的事件后,会进行处理,也就是开门,迎接然后聊天吃饭等等。这一系列的事件组成了”你和你朋友今天发生的事务“,而这个事务,是由异步事件驱动的,也就是你朋友敲门的那一刻!
看到这,你是不是恍然大悟!原来这就是响应式编程!当然,里面也涉及了一个观察者模式(后面会着重讲解),但现在你可以先不用管,理解它的最核心,最本质的思想就可以了。
怕你忘记,这里再强调一遍: 基于异步事件来驱动事务 !
3. 所以Rx的意思是什么?
在这里,我们就可以对Rx做一个总结了。上文提到,Rx全称为“Reactive Extensions”,即“响应式扩展”。
Rx是一种旨在扩展和增强响应式编程的能力的库或框架,目标是让开发者更容易地以响应式编程范式处理异步和事件驱动的程序。比如RxJava、RxKotlin、RxJS等。
我们可以更通俗地理解为:Rx相当于是一种实践了响应式编程的库,没有这个库,我们不容易实现响应式编程(比如代码很难写,实现成本很高等)
4. 回到本节开始的问题,我们为什么要学习RxJava?
上面的内容中,我尽可能通俗易懂地介绍了RxJava中的Rx,基于以上介绍,我们也可以总结出,
RxJava就是一种支持响应式编程的,可以用Java语言实践的库。
到了这里,我们就彻底明白RxJava是干嘛的了,所以也不难回答,我们为什么要学习RxJava了。
- 极其方便地实现线程切换
我们不用像传统的方式那样,依赖Handler等进行线程之间的切换,学习成本高,还容易写错,依赖RxJava,你可以非常方便的实现线程切换:
一行代码就能切走一个线程!一行代码也能切回一个线程!
- 极其方便地实现数据转换
这个我在刚刚的内容中,其实没有特别介绍,但在刚刚的例子里面,其实已经蕴含了,不知道你发现没有?
比如你朋友来按门铃,这是一个事件,这个事件可能返回某种类型,你可以基于这种类型,做一些处理,把这种类型转为另外一个数据。
比如你朋友来了,这是一个Boolean类型的数据,值为true,表示朋友已经来了,你在收到这个true的时候,要进行一些处理,比如和你的朋友进行一个拥抱,然后返回一个新的数据,比如也是Boolean,值为true,表示招待成功。这样就相当于把“你朋友来没来”的数据,转换成了“你招没招待你朋友”的数据。这相当于进行了一次转换。
而在RxJava里面,可以非常方便地实现这种数据转换,而且可以转换多次,比如map、flatMap操作符等
- 响应式编程思维的养成
基于RxJava,你可以尽情享受响应式编程给你带来的好处,你不用一直轮询,而是等待它发出事件,不管这个逻辑多复杂,你都能做到以一连串地链式调用的形式,思路清晰地完成代码编写,而且易于维护,不管后续逻辑怎么改,怎么动,这个架子永远不变。这对于一个大型项目来说,别提有多重要了,你可不想天天对着“屎山”写代码吧?
这还不是最厉害的,等你日复一日,年复一年,写成习惯的时候,你就会习惯这种模式,从而养成了响应式编程思维!在你后面的代码编写中,将会不知不觉的遵守着规范的编写标准,写出类似RxJava那样思路清晰、易于维护的代码!
- 框架本身的设计思想
等到后面介绍RxJava的原理时会讲到,它是如何利用观察者模式、装饰者模式的,如何实现线程间切换的,我相信这些设计思想,也足以让你受益匪浅!
- 业内应用非常广泛
RxJava在业内,是非常受欢迎的。这也决定了它的生态很好,也不会造成“你在这个公司学了,去了下个公司用不到”的情况。对日常的工作也很有帮助!
我相信它的优点绝对不止这些,大家可以在评论区补充,但我相信,这些优势,已经可以说服你去学习它,掌握它了。
三. 总结
本篇文章就到这里了,我以尽可能通俗易懂的语言,向你介绍了什么是“响应式编程”,什么是“Rx”,以及“我们为什么要学习RxJava”。你是否觉得兴致勃勃,已经迫不及待想要开始学习了?
太棒了!让我们开始下一节内容吧!