前言
关于Jetpack系列文章本来早都有计划开写,无奈前段时间,项目紧张,连着凌晨一两点的赶项目,想着等项目上线了,终于可以歇一口气,可是又接连发生一些事,比如,正在解决bug的时候,被叫去开会,让通知下面的人打包走人。
当然也包括我在内的整个部门,刺激不刺激,哈哈
起因:
当初Jetpack出来的一段时间,我对这个系列的东东都知之甚少,就知道是Google出的,对,没看错,又是人家谷歌的,直到今年年初新项目立项的时候,我才选了Kotlin语言开发,使用了Jetpack系列组件,可是在使用的过程中,就在想,为什么这么使用?它的作用是什么?它与其他的组件之间的关系是什么?为什么Google要这么设计?
OK,假如想知道这些为什么的话,请继续往下看
正文
其实App的整个过程用一句话总结的话,那就是从后台服务器拿到数据,然后展示到相应的view上
完了?这就完了?对,你没看错,这就完了,你想想,还有什么,还有什么好聊的,那既然这么简单的话,Google设计Jetpack干嘛,no! no! no! 天生我材必有用,即使被裁又何惧,下面请听我一一道来。
DataBinding
在它之前,我们app里刷新view怎么写,一般都采用findviewById,或者ButterKnife拿到view对象,然后在数据刷新的地方,更新view。可是当我们遇到一些情况,比如手机横竖屏切换,比如适配手机和pad,需要加载不同的视图,当一些情况下,需要展示一些view,当另一种情况下,一些view不需要展示,这就不好搞了,所以这就引出我们今天的第一个主角 DataBinding。
它的主要目的就是把布局中存在的控件和可观察的数据绑定在一起,那么当观察的数据发生刷新的时候,绑定了该数据的控件可以获得通知然后刷新(如果不存在的控件,当然也接收不到通知,那什么也不会发生)
OK,那这个页面通知,那个页面也通知,那我肿么办,我该听谁的,就跟我们使用EventBus 的时候,在onEventXXX方法里,收到的通知,但是是不是过期的,是不是旧的,哪个页面发过来的,都不知道,当我们想追责的时候,寻找源头,特别麻烦,那怎么行。所以就引出了今天的下一个主角 LiveData。
LiveData
这会LiveData来了,喊了一声,请大家放心的用我,我可以保证唯一信号源分发,只要你们那状态发生改变,那可以准确的知道,肯定是我这里发出的。你们那数据不对,那就来找我,我可以做到冤有头,债有主,就这么硬气
行,保证了唯一信号源之后,那还有一个问题,村里的大喇叭一喊,今年收益不错,到时间分红了,大家都去村长家领钱,那邻村人听见了咋办,都来了那也不合适啊,那咱得把喇叭作用域搞清楚,本着做事高调,做人低调的原则,所以村里微信群里低调发一声,咱全村人都知道就行了。这就引出了我们下一个主角:ViewModel。
ViewModel
ViewModel来了,这哥们说,我可以持有LiveData,不仅能解决作用域问题,还能解决页面通信问题,我咋这么能呢?
就因为在创建我的时候,指定了我的ViewModelStoreOwner,你指定我是村里的区域,那我就是村长,我只喊咱们村的,通知村里各小组(Fragment),你指定我是镇里的,那我就是镇长,我就通知到每个村,并且我还能保证村与村之间的通信,谁让我是镇长呢。
OK,如果你是村长,你在咱们村里工作,如果你是镇长,那你去通知每个村,但是通知也是讲时机的,大晚上十二点开喇叭,那也不合适是吧,这里就引出了今天最后一个主角:Lifecycle。
Lifecycle
Lifecycle来了,这哥们说,我可以管理生命周期一致性,做到一处修改,处处生效,你们都可以感知到我的生命周期,然后我可以控制喇叭啥时候该喊,啥时候不该喊。这样不扰民就好了。我可以与LiveData一起配合工作,让LiveData在合适的时机工作。拒绝内卷,拒绝996。就是这么完美!
总结
综上所述,ViewModel控制它持有的LiveData可以工作的作用域,让LiveData知道在哪个区域范围内做事,它还能解决页面通信问题,而Lifecycle告诉ViewModel持有的LiveData应该在合适的时机(什么时候开始,什么时候结束,什么时候及时叫停)里发出通知,当LiveData发出通知后,作用域内的DataBinding收到通知,并刷新对应的控件。
尾声
今天的开胃菜就到这里,这篇文章的主要目的就是让同学们可以从大局出发,知道Jetpack的每个组件的职责边界,以及他们之间是如何相互配合的。这里我们再思考最后一个问题,Google为什么设计这一套东东出来,其实我想,这会大家心里都应该有了答案,使用Jetpack组件可以让一个研发人员(即使是一个新手)快速得开发出一款APP,也可以快速的添加新的开发人员。通过 Android Jetpack 可以让 BUG 减少,让我们把更多的精力放在打造应用本身。
后面,我会逐个通过源码的角度去分析其中每一个组件的设计原理,以及他们之间是如何配合使用的,敬亲期待,荆轲刺秦王。