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

moh*_*eti 5 android kotlin android-viewbinding

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

还需要将此 autoCleared 用于哪些变量?我将它用于 viewBinding 和 recyclerview 适配器。

bei*_*rad 0

你有2个选择:

1-取消其销毁后可能访问视图的所有正在运行的作业。重写onDestroyView()来执行此操作。

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

viewLifecycleOwner.lifecycleScope.launch {
    // do sth with view    
}
Run Code Online (Sandbox Code Playgroud)

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"
    }
}
Run Code Online (Sandbox Code Playgroud)