大放光彩的安卓Jetpack组件-ViewModel(二)

220 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第15天,点击查看活动详情,希望大家多多支持,帮忙点个赞,谢谢!

前言

上回我们说到使用方法,但没有具体去说明使用的要点,其实ViewMode还是挺容易上手的,这节我们来具体说明一些使用要点与运用方式。

正篇

要点一

上节我们说到使用方法先是创建了继承ViewModel的类然后在Activity中使用,其中我们通过下面代码去获取实例:

viewModel = ViewModelProvider(this).get(MainViewModel::class.java)

这里需要注意的就是,我们绝对不能直接去创建ViewModel的实例,而是要像上面代码一样,一定要通过ViewModelProvider来获取ViewModel的实例,具体的语法规则如下所示:

ViewModelProvider{<Your Activity or fragment 实例>}.get{<Your ViewModel>::class.java}

解释一下这么写的原因,之前我们说到过ViewModel在横竖屏数据存留方面有应用是因为有和Activity不同的生命周期,这里的原因就是如此,ViewModel有其独立的生命周期,并且其生命周期还要长于Activity。如果此时我们在onCreate()方法中创建出ViewModel实例,那么每次onCreate()方法执行时,ViewModel都会去创建一个新实例,这样在手机屏幕发生旋转的时候,也就和Activity一样无法保留其中的数据。

要点二

其实ViewModel我们只是利用了其生命周期,但不可能每次我们构造函数中都没有任何参数,我们还是需要通过构造函数去传递一些参数的,那么怎么办呢?
我们可以去使用ViewModelProvider.Factory实现,如下:

class MainViewModel(countReserved: Int) : ViewModel() {
    var counter = countReserved
}
class MainViewModelFactory(private var countReserved: Int) : ViewModelProvider.Factory {

    override fun <T : ViewModel> create(modelClass: Class<T>): T {
        return MainViewModel(countReserved) as T
    }
}

因为此处create()方法的执行时机与Activity的生命周期无关,所以不会出现activity中直接创建ViewModel实例所出现的问题。

小结

下节我们将继续探索ViewModel,看看ViewModelProvider.Factory实现在Activity中的部分。