为什么我可以用实例创建 ViewModel
Why can i create ViewModel with instance
我在片段中使用 ViewModelProvider.Factory 创建了 ViewModel。一切正常。
var reportViewModel = ViewModelProviders.of(this,ViewModelProvide(RemoteDataProviderImpl(
WeakReference(context!!))))
.get(ReportViewModel::class.java)
但是在我直接用实例创建视图模型之后一切正常
var reportViewModel = ReportViewModel(RemoteDataProviderImpl(WeakReference(context!!)))
很简单的 ViewModel
class ReportViewModel(private var provider:RemoteDataProvider) : ViewModel(){
var posts = MutableLiveData<List<Report>>()
fun getPost(){
provider.getComments().enqueue(object : Callback<ArrayList<Report>> {
override fun onFailure(call: Call<ArrayList<Report>>, t: Throwable) {
t.message
}
override fun onResponse(
call: Call<ArrayList<Report>>,
response: Response<ArrayList<Report>>
) {
if (response.isSuccessful){
val reports = response.body()
posts.value = reports
}
}
})
}
}
这两个代码有什么区别。如果我可以直接创建 viewModel 为什么我需要 ViewModelProviders?
使用 ViewModelProviders
将允许 Android 将 ViewModel
附加到内部 ViewModelStore
。这将允许一些细节,比如在 activity 或片段被销毁时调用 onCleared
函数。另一个是视图模型在配置更改(例如方向)时的保留。
ReportViewModel(RemoteDataProviderImpl(WeakReference(context!!)))
将
创建视图模型的新引用,不包含 activity 或片段的任何范围。
将在 activity 的 onCreate
中创建 viewmodel
的 new reference
。 (即使轮换 activity 或更改配置)
它不会观察activity的范围,即它会存在甚至当 activity 是 destroyed
!
同时
ViewModelProvider.of(this).get(...)
将
Observe
activity 的范围,即当 activity is finished
时,将调用 viewmodel 的 onCleared(..)
! ( Viewmodel 会被销毁 )
Same instance of the viewmodel
即使在 configuration change
.
期间也会 persist
因为当你更改配置时(旋转 phone),
如果直接创建 viewModel,viewModel 将破坏并丢失 viewModel 中的所有数据。
但是如果你使用ViewModelProvider
创建viewModel,ViewModelProvider
会保存viewModel实例和数据,所以你不会在配置更改时丢失任何数据。
我在片段中使用 ViewModelProvider.Factory 创建了 ViewModel。一切正常。
var reportViewModel = ViewModelProviders.of(this,ViewModelProvide(RemoteDataProviderImpl(
WeakReference(context!!))))
.get(ReportViewModel::class.java)
但是在我直接用实例创建视图模型之后一切正常
var reportViewModel = ReportViewModel(RemoteDataProviderImpl(WeakReference(context!!)))
很简单的 ViewModel
class ReportViewModel(private var provider:RemoteDataProvider) : ViewModel(){
var posts = MutableLiveData<List<Report>>()
fun getPost(){
provider.getComments().enqueue(object : Callback<ArrayList<Report>> {
override fun onFailure(call: Call<ArrayList<Report>>, t: Throwable) {
t.message
}
override fun onResponse(
call: Call<ArrayList<Report>>,
response: Response<ArrayList<Report>>
) {
if (response.isSuccessful){
val reports = response.body()
posts.value = reports
}
}
})
}
}
这两个代码有什么区别。如果我可以直接创建 viewModel 为什么我需要 ViewModelProviders?
使用 ViewModelProviders
将允许 Android 将 ViewModel
附加到内部 ViewModelStore
。这将允许一些细节,比如在 activity 或片段被销毁时调用 onCleared
函数。另一个是视图模型在配置更改(例如方向)时的保留。
ReportViewModel(RemoteDataProviderImpl(WeakReference(context!!)))
将
创建视图模型的新引用,不包含 activity 或片段的任何范围。
将在 activity 的
onCreate
中创建viewmodel
的new reference
。 (即使轮换 activity 或更改配置)它不会观察activity的范围,即它会存在甚至当 activity 是
destroyed
!
同时
ViewModelProvider.of(this).get(...)
将
Observe
activity 的范围,即当activity is finished
时,将调用 viewmodel 的onCleared(..)
! ( Viewmodel 会被销毁 )Same instance of the viewmodel
即使在configuration change
. 期间也会
persist
因为当你更改配置时(旋转 phone), 如果直接创建 viewModel,viewModel 将破坏并丢失 viewModel 中的所有数据。
但是如果你使用ViewModelProvider
创建viewModel,ViewModelProvider
会保存viewModel实例和数据,所以你不会在配置更改时丢失任何数据。