android - 我是否需要手动清除ViewModel中的监听器变量以避免内存泄漏?

标签 android android-fragments viewmodel

如果我像这样设置了片段和视图模型,并从片段中设置了一个动作变量,因此有隐式引用,那么视图模型在死亡时会清除该引用本身,并打破潜在的引用周期,还是应该清除在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。我假设您想在加载数据之前显示一些指示器,然后再隐藏它。因此,在加载数据之前立即显示指标,然后将其隐藏在onChangeObserver中:

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/

相关文章:

android - 如何在主要 Activity 中执行 "click called"之前等待?

安卓相机控制

java - AsyncTask doInBackground 中的多线程代码

android - 在方向更改时从双 Pane 切换到单 Pane 以维护 fragment 堆栈

android - 组件导航,带参数从后台弹出

asp.net-mvc - ViewModel 有自己的逻辑吗?

Android:将用户名保留在 session 中直到注销

来自 ABS fragment 的 Android 通知 'Cannot resolve method ' build()'

android - 如何获取xml文件中实时数据的值数据绑定(bind)android

serialization - 使用 MvvmCross ShowViewModel 传递复杂的导航参数