前言
作为一名Android开发者,如果你熟悉MVVM架构
,熟悉Jetpack
组件,那么相信你肯定使用过ViewModel
。
正如它的名字一样,它是Google推出的一个类,方便我们实现MVVM架构
中的ViewModel层
。我们在其中处理View层
所需的数据,然后在特定条件下通知View层
进行UI更新
。
正如官方所介绍:
ViewModel
类以注重生命周期的方式存储和管理界面相关的数据。ViewModel
类让数据可在发生屏幕旋转等配置更改后继续留存。
我们抓一下这句话的重点:
- 注重生命周期的方式:会在合适的时间进行自我回收,防止出现内存泄漏。
- 存储和管理界面相关的数据:符合
MVVM架构
中ViewModel层
的理念。 - 在发生屏幕旋转等配置更改后继续留存数据:为什么要这么设计?怎么做到的。
接下来,就让我们带着问题,深入学习一下ViewModel类。
使用方法
在阅读源码前,让我们先来简单回顾一下ViewModel的使用方法。
class MainViewModel(private val repository: MainRepo) : ViewModel() {
private val _textMld = MutableLiveData<String>()
val textLd: LiveData<String> = _textMld
fun getTextInfo() {
viewModelScope.launch {
withContext(Dispatchers.IO) {
//做异步网络请求工作,获取到textData
repository.getTextInfo()
}.apply {
_textMld.postValue(textData)
}
}
}
}
class MainActivity : AppCompatActivity() {
fun setVmFactory(): ViewModelProvider.Factory {
return object : ViewModelProvider.Factory {
override fun <T : ViewModel> create(modelClass: Class<T>): T {
return MainViewModel(MainRepo()) as T
}
}
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
val vm = ViewModelProvider(this, setVmFactory())[MainViewModel::class.java]
vm.textLd.observe(this, Observer {
binding.textTv.text = it
})
}
}
方法步骤可以简单分为两步,分别为:
继承ViewModel
类实现自定义ViewModel
,如:MainViewModel。- 通过
ViewModelProvider
来实例化ViewModel
。
源码
现在,根据上方所介绍的使用方法,我们进一步来看一下ViewModel的源码。
public abstract class ViewModel {
....
@SuppressWarnings("WeakerAccess")
protected void onCleared() {
}
@MainThread
final void clear