视图被销毁后从另一个线程访问的 AutoClearedValue

时间:2021-02-13 08:38:02

标签: android kotlin android-viewbinding

我正在使用 this link 中的 AutoClearedValue 类,当视图被销毁时,支持字段变为空,这很好,但我有一个线程(实际上是一个 kotlin 协程),在完成后,它访问值(它使用 autoCleared)但是如果在它的工作完成之前我导航到另一个片段(这个片段的视图被破坏),然后它尝试访问该值,但由于它为空我得到一个异常,因此崩溃。 我该怎么办?

还有哪些变量需要使用这个自动清除?我将它用于 viewBinding 和 recyclerview 适配器。

2 个答案:

答案 0 :(得分:0)

您有两个选择:

1- 取消所有在销毁后可以访问的正在运行的作业。覆盖 onDestroyView() 以执行此操作。

此外,您可以启动协程 viewLifecycleOwner.lifecycleScope 以在视图销毁时自行取消。

viewLifecycleOwner.lifecycleScope.launch {
    // do sth with view    
}

2-(首选解决方案)在协程和视图之间使用生命周期感知组件(例如 LiveData):

协程推送实时数据中的状态或数据,您必须在 viewLifeCycleOwner 范围内观察它以更新视图。

private val stateLiveData = MutableLiveData<String>()

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)

    stateLiveData.observe(viewLifecycleOwner) { value ->
        binding.textView.text = value
    }
}

private fun fetchSomething() {
    lifecycleScope.launch {
        delay(10_000)
        stateLiveData.value = "Hello"
    }
}

答案 1 :(得分:-1)

当绑定视图时,假设一个片段尝试像 private lateinit val exampleBinding : FragmentExampleBinding by autoCleared() 之类的东西。 AutoCleared 主要用于像我在 MVVM 模式中使用生命周期观察者的情况

相关问题