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

Android 如何防止在使用ViewModel更改配置后再次重新加载数据?,android,android-architecture-components,android-livedata,android-viewmodel,Android,Android Architecture Components,Android Livedata,Android Viewmodel,每次旋转后重新加载数据 我在onCreate中获取数据,并在onCreateView()中观察数据。 我想知道在旋转手机后(或在配置更改后),数据会重新加载,因此在旋转前我有这些日志 fetchConfig ->observe 旋转之后 我有 如何防止第二次重新加载数据? 我在fetchConfig()中添加了 但我不确定这是不是最好的解决办法 private val viewModel: HomeViewModel by lazyViewModel() override fun on

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

fetchConfig ->observe 
旋转之后 我有

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

但我不确定这是不是最好的解决办法

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)
}

}

我认为一个解决方案是将对
fetchConfig()
的调用移到
ViewModel

init
块中。我也有类似的问题。有人建议我尝试对LiveData进行事件包装,它解决了我的问题:)

以下是链接:


希望这有帮助

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


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

我没有足够的声誉来添加评论。传达信息的唯一方法是添加答案。你们的意思是,若数据是在savedInstanceState中提取的,那个么保持状态?这可能是一种方法。但同样,数据必须在其他地方。那个地方应该对检索到视图模型的内容进行验证。我不明白你所说的“那个地方应该对检索到视图模型的内容进行验证”是什么意思。你能解释一下吗?Fredy Trujiillo我已经阅读了你发布的arcticles,谢谢,如果我与savedInstanceState结合使用,但是在一种情况下,
活动是在系统停止后创建的:
在这种情况下,savedInstanceState不会为null,但是viewModel中的数据为null。我如何知道数据为null?
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)
}

}