浅析ViewModel、LiveData、DataBinding原理
一.ViewModel
在MVVM模式中,数据和业务逻辑可以集中在ViewModel中处理,实现功能时只需要在ViewModel中关注数据和业务即可,不需要和UI或者控件打交道。
1.ViewModel的创建和复用流程如下
2.销毁
在ViewModelStore类中找到了clear(),也就是清除了缓存。
1 | public final void clear() { |
Activity中的销毁:使用LifeCycle监听生命周期,最后在ON_DESTROY中清除store:getViewModelStore().clear();
Fragment中的销毁:
首先需要明确,在fragment中有几个状态:
1 | static final int INITIALIZING = -1; // Not yet attached. |
在add时,状态是从INITIALIZING一步步升级到RESUMED
相反,remove的时候,状态则会从RESUMED一步步退回到INITIALIZING,具体可以参考下面的图片:图片来源:https://www.sohu.com/a/471240132_121124376
再回到刚刚的ViewModelStore的clear,点击查看调用路径:
FragmentManagerViewModel::clearNonConfigState <- FragmentStateManager::destroy()
1 | void moveToExpectedState() { |
这时会看到,只有当状态退回到CREATE和ATTACHED时,才会调用destroy,说明此时这个fragment正在销毁,也可以看到调用完clearNonConfigState,会调用fragment.onDestroy
1 | void destroy() { |
二、LiveData
基本原理:LiveData是感应数据的变化。首先对某个变量设置observer,当调用setValue或postValue时,会找到对应的observer并回调到onChanged方法。
源码大致解析如下图:
三、databinding
databinding:数据绑定,是Google官方发布的一个框架,是mvvm在android上的一种实现,用于降低布局和逻辑的耦合性,使代码逻辑更加清晰,可以直接绑定数据到xml中,并实现自动刷新。databinding能够省去findviewbyId,大量减少activity的代码,数据能够单向或双向绑定到layout文件中,有助于防止内存泄漏,而且能自动进行空检测以避免空指针异常。
databinding包括单向数据传递和双向传递
单向传递主要原理是通过setXX来改变所有数据(如viewModel或者user这样具体的对象),通过requestRebind进行全部更新绘制
双向传递则是利用textWatcher的原理,当监听到文字变化时,改变对象的某个属性。由于初始化是一定会调用setXX来绑定数据和view,此时会添加一个callback。当对象属性(如user.setName())改变时会notify对应的callback,表示数据改变。最后也是通过requestRebind更新
大致原理图如下:
以上是jetpack这几个组件的原理。图是自己根据源码大概画的流程,如有哪里错误或者需要解释的可以留下评论。当然如果有幸能得到认可,想要转发的话,也请标注一下来源,谢谢。