如果我像这样设置了片段和视图模型,并从片段中设置了一个动作变量,因此有隐式引用,那么视图模型在死亡时会清除该引用本身,并打破潜在的引用周期,还是应该清除在viewModel.onCleared()
中手动进行此操作?
class MyFragment: BaseFragment() {
lateinit var viewModel: MyViewModel
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
return FragmentMyBinding.inflate(inflater, container, false).also { binding ->
binding.viewModel = ViewModelProviders.of(this).get(MyViewModel::class.java).apply {
viewModel = this
showLoader = {
// code to display loading spinner
}
}
binding.lifecycleOwner = viewLifecycleOwner
}.root
}
}
...
class MyViewModel: ViewModel() {
lateinit var showLoader: () -> Unit
...
最佳答案
您不应在ViewModel
中执行任何与UI相关的操作。您的ViewModel
应该通过Fragment/Activity
将数据提供给您的Observer
。我假设您想在加载数据之前显示一些指示器,然后再隐藏它。因此,在加载数据之前立即显示指标,然后将其隐藏在onChange
的Observer
中:
class MyFragment: BaseFragment() {
lateinit var viewModel: MyViewModel
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
// show your indicator here
showYourIndicator()
return FragmentMyBinding.inflate(inflater, container, false).also { binding ->
binding.viewModel = ViewModelProviders.of(this).get(MyViewModel::class.java)
binding.viewModel.loadSomeData().observe(this@MyFragment, {
...
hideIndicator()
}
binding.lifecycleOwner = viewLifecycleOwner
}.root
}
}
关于android - 我是否需要手动清除ViewModel中的监听器变量以避免内存泄漏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58999315/