正篇
要点一
上节我们说到使用方法先是创建了继承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中的部分。