在使用片段时,我很难理解用于视图模型和实时数据的范围。这是我的ViewModel:
class MyViewModel: ViewModel() {
var myLiveData = MutableLiveData<WrappedResult<DataResponse>>()
private val repository = MyRespository()
private var job: Job? = null
fun getData(symbol: String) {
job = viewModelScope.launch(Dispatchers.IO) {
try {
val response = repository.getData(symbol)
withContext(Dispatchers.Main) {
myLiveData.value = WrappedResult.Success(response)
}
} catch(e: Exception) {
withContext(Dispatchers.Main) {
myLiveData.value = WrappedResult.Failure(e)
}
}
}
}
}
我可以使用(其中“ this”是片段)在片段中创建视图模型:
viewModel = new ViewModelProvider(this).get(MyViewModel.class);
但是,我可以通过两个选项观察LiveData:
viewModel.getMyLiveData.observe(this...
或
viewModel.getMyLiveData.observe(getViewLifecycleOwner()...
看来,我在视图模型中创建的作业将被限制在片段的生命周期内(通过viewModelScope),而不是片段的视图生命周期,但对于实时数据,我可以在这两者之间进行选择。
我可以使用一些指导以及最佳实践。另外,片段是否保留了实例是否与这有关系吗?当前该片段具有setRetainInstance(true)。最后,从我读过的所有内容中,我不需要在片段中清除观察者或以这种方式设置时重写onCleared。正确吗?
答案 0 :(得分:0)
参考视图模型文档
只有完成活动后,视图模型才会被存储。由于片段位于活动性顶部,因此片段的生命周期不会影响视图模型,数据将保留在视图模型中。因此,您可以在进入片段的oncreate时编写一种方法来重置viewmodel中的数据。
在Fragment中,OnCreate:
getViewModel.init()
在ViewModel上
fun init() {
// clear all varialbes/datas/ etc here
}