ViewModel
简单来说,activity因为屏幕旋转这类问题导致activity被销毁重新创建的时候,数据会丢失。为了避免数据丢失的情况。可以把数据存储在ViewModel中。
来张官网的生命周期图感受下
注意啦:activity或fragment的作用范围从created到finished,你不能混淆销毁。请记住,当一个设备被旋转时,activity会被销毁,但是任何与它相关的ViewModel实例不会被销毁。
viewModel不可以存在上下文引用!会引发内存泄漏
ViewModel
对象存在的时间范围是获取ViewModel
时传递给ViewModelProvider
的Lifecycle
。ViewModel
将一直留在内存中,直到限定其存在时间范围的Lifecycle
永久消失:对于 Activity,是在 Activity 完成时;而对于 Fragment,是在 Fragment 分离时。
viewModel的作用范围是activity,如果一个activity下有2个不同的fragment,那么这俩ffragment去获取同一个Viewmoel的类实例的话,将会得到同一个对象!这可以用来做数据传递咯~
注意:viewModel的作用范围是activity实例!
步骤:使用过于简单,2333----
class DataModel(i: Long) : ViewModel() {
private var datas: MutableLiveData<Long> = MutableLiveData()
fun getDatas(): MutableLiveData<Long> {
return datas
}
fun setDatas(i: Long) {
datas.postValue(i)
}
init {
datas.postValue(i)
}
}
创建一个类,继承了ViewModel,在该类中申明属性。配合LiveData使用。
创建一个Provider类,用来创建dataViewModel。为啥用这个创建呢?因为们的DataModel构造函数带有参数哈,如果是无参数的可以不用这种方式
class DataModelProvider constructor(private val i: Long) : ViewModelProvider.Factory {
override fun <T : ViewModel?> create(modelClass: Class<T>): T {
return modelClass.getConstructor(i::class.java).newInstance(i)
}
}
之后,在activity中这么写即可:
val dataModelProvider = DataModelProvider(SystemClock.elapsedRealtime())
val dataModel = ViewModelProvider(this, dataModelProvider)
.get(DataModel::class.java)
//无参数写法
//ViewModelProvider(this).get(DataModel::class.java)
chronometer.base = dataModel.getDatas().value ?: SystemClock.elapsedRealtime()
chronometer.start()
chronometer的base设置从dataModel中获取,这样当屏幕旋转导致activity重新创建的时候,数据就会重viewModel中获取保存下来的内容·。