片段中的生命周期范围



在使用片段时,我很难理解视图模型和实时数据的作用域。这是我的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(,而不是片段的视图生命周期,但对于实时数据,我可以在这两者之间做出选择。

我可以提供一些指导以及这里的最佳实践。另外,这个片段是否保留了实例,这些都有关系吗?当前片段已设置RetainInstance(true(。最后,从我读到的所有内容来看,当事情以这种方式设置时,我不需要清除片段中的观察者或覆盖onCleared。这是正确的吗?

参考视图模型的文档

https://developer.android.com/topic/libraries/architecture/viewmodel?gclid=Cj0KCQjwtZH7BRDzARIsAGjbK2blIS5rGzBxBdX6HpB5PMKgpUQHvdKXbwrt-ukTnWkpax1oMk4sm4aAuzPEALw_wcB&gclsrc=aw.ds#生命周期

只有在活动完成后,Viewmodel才会被破坏。由于片段位于活动的顶部,因此片段的生命周期不会影响Viewmodel。数据将在Viewmodel上持久化。因此,您可以编写一个方法来重置视图模型中的数据,同时输入以创建片段。

在Fragment中,OnCreate:

getViewModel.init()

关于ViewModel

fun init() {
// clear all varialbes/datas/ etc here
}

最新更新