每次旋转后重新加载数据 我在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)
}
}
答案 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生命周期。我强烈建议您阅读这些文章。
总结。您的解决方案不是最好的。最好的方法是实现一个正确的层,以一种不依赖于Android生命周期的方式来获取信息。