Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 视图销毁后从另一个线程访问的AutoClearedValue_Android_Kotlin_Android Viewbinding - Fatal编程技术网

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

Android 视图销毁后从另一个线程访问的AutoClearedValue,android,kotlin,android-viewbinding,Android,Kotlin,Android Viewbinding,我正在使用AutoClearedValue类,当视图被销毁时,支持字段变为null,这很好,但我有一个线程(实际上是一个kotlin协程),它在完成后访问该值(使用autoCleared),但如果在它的工作完成之前,我导航到另一个片段(该片段的视图被销毁),然后它尝试访问该值,但由于它为null,我得到一个异常,因此崩溃。 我能做些什么 还需要为哪些变量使用此自动清除?我将其用于viewBinding和recyclerview适配器。当绑定视图时,让我们假设一个片段尝试类似于私有lateinit

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


还需要为哪些变量使用此自动清除?我将其用于viewBinding和recyclerview适配器。

当绑定视图时,让我们假设一个片段尝试类似于私有lateinit val exampleBinding:FragmentExampleBinding by autoCleared()。AutoCleared的使用方式与我在MVVM模式下使用lifecycle Observators时的情况类似,您有2个选项:

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

此外,您还可以启动协同程序
viewLifecycleOwner.lifecycleScope
,以便在视图销毁时自行取消它

viewLifecycleOwner.lifecycleScope.launch {
    // do sth with view    
}
2-(首选解决方案)在协同程序和视图之间使用生命周期感知组件(如LiveData):

协同路由将状态或数据推送到实时数据中,您必须使用范围来观察它以更新视图

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"
    }
}
private val stateLiveData=MutableLiveData()
覆盖已创建的视图(视图:视图,保存状态:捆绑?){
super.onViewCreated(视图,savedInstanceState)
stateLiveData.observe(viewLifecycleOwner){value->
binding.textView.text=值
}
}
私人娱乐{
生命周期望远镜发射{
延迟(10_000)
stateLiveData.value=“你好”
}
}

您不能在访问之前进行空检查吗?可空字段位于autoClearedValue中,因此我无权访问它。我可以把每件事都放在try/catch中,但那是可以忘记和引起注意的problems@mohsensameti您应该以生命周期感知的方式调用协同程序。因此,更新仅在视图至少启动时发生。例如,如果您正在调用一个web服务,那么您应该过度服务于响应,当响应到来时,数据不会通知您的片段,因为它已被销毁。这就是我正在做的,问题是我的代码在片段的视图被销毁后访问此值,但片段没有(导航到另一个片段)停止碎片销毁方法上的所有碎片观察员