Jetpack学习笔录-ViewModel

ViewModel

简单来说,activity因为屏幕旋转这类问题导致activity被销毁重新创建的时候,数据会丢失。为了避免数据丢失的情况。可以把数据存储在ViewModel中。

来张官网的生命周期图感受下

注意啦:activity或fragment的作用范围从created到finished,你不能混淆销毁。请记住,当一个设备被旋转时,activity会被销毁,但是任何与它相关的ViewModel实例不会被销毁。

viewModel不可以存在上下文引用!会引发内存泄漏

ViewModel 对象存在的时间范围是获取 ViewModel 时传递给 ViewModelProvider 的 LifecycleViewModel将一直留在内存中,直到限定其存在时间范围的 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中获取保存下来的内容·。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值