ViewModel是View与Model之间的一个桥梁,项目中用在了网络请求数据之前,它会回调到View或者Presenter层
ViewModel
ViewModel
介于View
(视图)和Model
(数据模型)之间的一个东西。它起到了桥梁的作用,使视图和数据能够分离开,也能够保持通信。
Activity
:展示数据;处理用户交互
ViewModel
:持有UI数据
viewmodel生命周期
viewmodel的生命周期贯穿整个Activity的生命周期,当此Activity调用onDestroy时才销毁
ViewModel独立于配置变化。即屏幕旋转等所导致的Activity重建,不会影响ViewModel的生命周期,所以不用考虑数据的存储与恢复。
用ViewModel前后的架构图
未用jetpack前的mvc架构
用viewmodel后的架构图
使用ViewModel后把页面数据统一到一个单独类里,不用在Activity中进行设置变量等来管理。
ViewModel的基本使用方法
- 在 app 的 build.gradle 中添加依赖
1 | dependencies{ |
- 实现个计时器功能
1 | public class TimerViewModel extends ViewModel{ |
1 | //使用这个 TimeViewModel |
AppCompatActivity
的父类FragmentActivity
有实现了ViewModelStoreOwner
,ViewModelStoreOwner
里是用HashMap<String, ViewModel>
来存储 ViewModel
的,即 ViewModel
与页面之间没有直接的关联,它们通过 ViewModelProvider
进行关联。所以要注意:不要向 ViewModel 传入任何类型的 Context 或带有 Context 引用的对象,因为可能会导致内存泄露。
当希望在 ViewModel
中使用 Context
,那么可以使用 AndroidViewModel
类,并传入 Application
作为 Context
ViewModel 与 onSaveInstanceState() 方法
onSaveInstanceState()
只能保持少量的、能支持序列化的数据;ViewModel
支持页面中所有的数据。
onSaveInstanceState()
可以持久化页面数据;ViewMode
不支持数据的持久化,当界面被彻底销毁时,ViewModel
及其持有的数据就不存在了。
ViewModelSavedState
用 ViewModel+LiveData+DataBinding+ViewModelSavedState
架构
build.gradle
1 | buildscript { |
app/build.gradle
- 打开databinding开关
- 加入androidx.lifecycle:lifecycle-viewmodel-savedstate依赖库
1 | apply plugin: 'com.android.application' |
activity_main.xml
- 布局文件转为databinding格式的;同时调用viewModel中的属性和方法
1 |
|
MyViewModel.kt
- viewmodel中加上SavedStateHandle来保存数据
1 | //构造方法传参 |
在activity
中使用MainActivity.kt
Activity
中实例化DataBinding
- 实例化
viewModel
- 给
databinding
赋值,指定lifecycleOwner
对象
1 | class MainActivity : AppCompatActivity() { |