片段中的生命周期范围

时间:2020-09-18 21:37:52

标签: android mvvm android-livedata

在使用片段时,我很难理解用于视图模型和实时数据的范围。这是我的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。正确吗?

1 个答案:

答案 0 :(得分:0)

参考视图模型文档

https://developer.android.com/topic/libraries/architecture/viewmodel?gclid=Cj0KCQjwtZH7BRDzARIsAGjbK2blIS5rGzBxBdX6HpB5PMKgpUQHvdKXbwrt-ukTnWkpax1otMk4sm4aAuzPEALw_wcB&gclsrc=aw.ds#lifecycle

只有完成活动后,视图模型才会被存储。由于片段位于活动性顶部,因此片段的生命周期不会影响视图模型,数据将保留在视图模型中。因此,您可以在进入片段的oncreate时编写一种方法来重置viewmodel中的数据。

在Fragment中,OnCreate:

 getViewModel.init()

在ViewModel上

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