如何使用ViewModel防止配置更改后第二次重新加载数据?

时间:2019-02-15 16:18:01

标签: android android-architecture-components android-livedata android-viewmodel

每次旋转后重新加载数据 我在onCreate中获取数据,并在onCreateView()中进行观察。 我想知道在旋转手机之后(或者在配置更改后再次重新加载数据,因此在旋转之前我有这些日志

fetchConfig ->observe 

以及旋转后 我有

observe ->fetchConfig ->observe

如何防止第二次重新加载数据? 我已经添加了fetchConfig()

if(customerConfigData.value==null) {} 

但是我不确定这是最好的解决方案

private val viewModel: HomeViewModel by lazyViewModel()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
viewModel.fetchConfig()
}

 override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
viewModel.customerConfigData.observe(viewLifecycleOwner, Observer {
Log.i("test","observe")
})
return inflater.inflate(R.layout.fragment_home,container,false)
}


 fun fetchConfig() {
Log.i("test","fetchConfig")

  uiScope.launch {
    val configEndpoint = EnigmaRiverContext.getExposureBaseUrl().append("v1/customer").append(AppConstants.CUSTOMER_UNIT)
        .append("businessunit").append(AppConstants.BUSINESS_UNIT).append("defaultConfig").append("?preview=true")

    val parsedData = homeRepository.fetchConfig(configEndpoint, GetConfigCall())
    customerConfigMutableData.postValue(parsedData)
}

}

3 个答案:

答案 0 :(得分:1)

我认为一种解决方案是将对fetchConfig()的调用移到init的{​​{1}}块中

答案 1 :(得分:0)

我也有类似的问题。建议我为LiveData尝试事件包装器,它已经解决了我的问题:)

以下是链接: How to stop LiveData event being triggered more than Once

希望这会有所帮助!

答案 2 :(得分:0)

如您所见,您的方法有一个名为savedInstanceState: Bundle?的参数。当配置更改时,此捆绑包能够保存应用程序的状态。因此,您可以在此处放置任何所需的标志。 现在,请记住,ViewModels设计为具有良好的代码库。因此,您需要将Ui层与业务层分开。 fetch配置方法应该在另一个类中,该类不依赖于Android生命周期。我强烈建议您阅读这些文章。

  

https://medium.com/androiddevelopers/viewmodels-persistence-onsaveinstancestate-restoring-ui-state-and-loaders-fc7cc4a6c090

     

https://developer.android.com/jetpack/docs/guide

总结。您的解决方案不是最好的。最好的方法是实现一个正确的层,以一种不依赖于Android生命周期的方式来获取信息。