很尴尬,在知乎看了扔物线的视频,受益匪浅,就把内容码了出来,后经查阅发现大佬已经汇总了博客【传送门】
LiveData是Android官方在2017年推出一系列架构组件中的一个,一起推出的还有Lifecycle和ViewModel等,这些组件后改称为Jetpack。LiveData成为了Jetpack的架构组件的元老级成员。为什么要走下坡路了?有人问Android官方“是要废弃LiveData吗”。
从RxJava说起,LiveData面世就受到了很大关注,一个原因就是让人想到了RxJava,LiveData是一个以观察者模式为核心,让界面对变量进行订阅,从而实现自动通知刷新的组件。而RxJava最核心的关键词就是观察者模式和事件流,所以很多人拿LiveData和RxJava作比较。有人说RxJava比LiveData好用,也有人说它没有RxJava强大,还有人说他俩根本就不是一个东西放在一起比较是没有意义的。
RxJava是在2014、2015年火起来的,国内晚一些,大概2016年开始爆火,当时全世界的劳动人民用RxJava一般是做两件事,网络请求以及event bus,网络请求就不说了,RxJava配合Retrofit来做网络请求,各种复杂操作和线程切换,谁用谁知道。现在用协程就可以了,比RxJava更方便,而event bus当时比较火的两个库GreenRobot的EventBus——同名库,以及Square的Otto。
在RxJava流行起来之后,大家发现,RxJava稍微定制一下,也能实现event bus的功能,既然我都用了RxJava,为啥不把event bus功能也交给它使用呢?就这样,一种叫RxBus的模式流行起来了,后来也有人开源了这样的库。
就在这样的时代背景下,2017年LiveData发布了,它的功能是让变量可以被订阅,跟一般的订阅比起来,LiveData有两个特点,一是它的目标非常直接,直指页面刷新,所以他的数据更新只发生在主线程;二是它借助了另外一个架构组件Lifecycle的功能,让他可以只在界面到了前台的时候才通知刷新,在后台的时候就闷不吭声,既避免了浪费性能,也避免了bug,很方便,很好用。
但是这里就有一个问题,变量的订阅,用RxJava不能做吗?为什么要开一个新库呢?RxJava就是专门做时间订阅的,是因为LiveData的数据更新发生在主线程?RxJava也可以啊,一个操作符的事observeOn(AndroidSchedulers.mainThread())
。那是因为它结合了Lifecycle,所以生命周期的支持比较到位?RxJava也可以,改改就可以了,总比写一个新库容易吧?所以LiveData的功能用RxJava可以实现吗?是完全可以的,没有任何问题。那Android官方为什么要做一个LiveData出来,而不是直接推荐大家使用RxJava来实现这样的功能?或者退一步,用RxJava来做LiveData的底层实现也行啊?为什么都没有?因为RxJava太大了!而且还不是Android官方自己的东西,而是别人的。Android作为一个平台,肯定要考虑开发者们的普遍水平,RxJava虽然好用,但是太复杂了,上手成本高,所以如果Android要用RxJava来实现LiveData,或者要推荐开发者们使用RxJava来自己实现LiveData的功能,那么它就考虑怎么让开发者学会RxJava,怎么学?自己教,出文档出视频,教大家使用RxJava。这样动作就大了,把事情变复杂了,再加上RxJava还既不是Android体系里的东西,也不是Google体系里的东西,那么如果Android团队就为了一个LiveData的功能去全网推广和教学RxJava逻辑就有点不对了,事情不是这么玩的。
所以RxJava太大了,并且是第三方的,这两个原因结合起来,就让Android的LiveData没有使用RxJava,这并不是一个竞争者或者胸怀的问题,而是,不要把事情变复杂的问题。
但,这只是当时(2017)的情况。2017年Android官方发布了架构组件,宣布对Kotlin的支持。接下来的几年里Kotlin自身变得越来越完善,协程也越来越完善。2017年之前,时间订阅大部分人用EventBus或Otto,并且在RxJava流行起来之后EventBus和Otto的使用开始持续下滑。2017年之后,对于简单场景慢慢过渡到了LiveData,而对于复杂的场景还在用RxJava,因为LiveData不适合复杂的场景。
- EventBus/Otto
- RxJava/EventBus/Otto
- LiveData/RxJava
- Flow
而现在,我们有了Flow,协程的Flow和RxJava的功能范围非常相似,近乎一致。但是,Flow是协程里必不可少的一部分,而协程是Kotlin必不可少的一部分,Kotlin又是Android开发里必不可少的一部分 Kotlin又是Android现在主推的开发语言以及未来趋势。
这样的话,Flow一出来,就没LiveData什么事了。别说LivaData,以后RxJava也没什么事了,这需要一个过程。LiveData和RxJava,尤其是RxJava,肯定会继续坚挺一段时间的,只是趋势会是这样。官方也说了,LivaData不会被废弃,两个原因,一,用Java写Android的人还需要它,Flow是协程的东西,如果是用Java开发的,其实没办法用Flow。二,LiveData学起来比较简单,而且功能对于简单场景来说是足够的,而RxJava和Flow这种东西学起来就没有LivaData这么轻松直观。为了Java语言的使用者和不想学RxJava或者Flow的人LiveData需要被保留。不过你用发展的眼光去看他这段话,不言而喻了。
对于不会LiveData的人还有必要学LiveData吗?以及对于已经在用LiveData的项目,需要快点移除LiveData吗?如果你不会LiveData,对于当下来说,还是很有必要学一下的。因为LiveData现在的应用率还是很高的,就算现在没用到,未来工作的团队可能会用,反正很简单,学一下很有必要。另一方面,在用LiveData的人,确实可以考虑将它摘除了,但也不是着急忙慌的把它拿走,它不是毒药地雷,只是现在协程的Flow可以做这件事了,而未来Flow是一定会成为主流的,就像现在的Kotlin一样。在项目里用两样东西来做事件订阅不如只用一样,因此可以考虑摘除LiveData,所以,就算着急,也应该着急去学习Flow,而不是着急的把LiveData拆掉。等以后你觉得他带来不方便了,自然会把它拆掉。