为什么我可以使用实例创建ViewModel

我在片段中使用ViewModelProvider.Factory创建ViewModel。一切正常。

var reportViewModel = ViewModelProviders.of(this,ViewModelProvide(RemoteDataProviderImpl(
        WeakReference(context!!))))
       .get(ReportViewModel::class.java)

但是在我直接使用实例创建viewmodel之后,一切正常

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?

www2281100 回答:为什么我可以使用实例创建ViewModel

使用ViewModelProviders将允许Android将ViewModel附加到内部ViewModelStore。这将带来一些好处,例如在销毁活动或片段时调用onCleared函数。另一个是视图模型在配置更改(例如方向)上的重现。

,
 ReportViewModel(RemoteDataProviderImpl(WeakReference(context!!)))

  • 创建视图模型的新引用,没有活动或片段的任何范围

  • 将在活动的new reference中创建viewmodel中的onCreate。 (即使活动已轮换或配置已更改

  • 不会观察该活动的范围,即即使该活动为destroyed也会存在

 ViewModelProvider.of(this).get(...)

  • Observe活动的范围,即,将调用viewmodel的activity is finishedonCleared(..)时! ( Viewmodel将被破坏

  • 即使在Same instance of the viewmodel期间,
  • persist也会configuration change

,

因为当您更改配置(旋转手机)时, 如果直接创建viewModel,则viewModel将破坏并丢失viewModel中的所有数据。

但是,如果您使用ViewModelProvider创建viewModel,ViewModelProvider将保存viewModel实例和数据,因此在配置更改时不会丢失任何数据。

本文链接:https://www.f2er.com/3097181.html

大家都在问