Android 视图销毁后从另一个线程访问的AutoClearedValue
我正在使用AutoClearedValue类,当视图被销毁时,支持字段变为null,这很好,但我有一个线程(实际上是一个kotlin协程),它在完成后访问该值(使用autoCleared),但如果在它的工作完成之前,我导航到另一个片段(该片段的视图被销毁),然后它尝试访问该值,但由于它为null,我得到一个异常,因此崩溃。 我能做些什么Android 视图销毁后从另一个线程访问的AutoClearedValue,android,kotlin,android-viewbinding,Android,Kotlin,Android Viewbinding,我正在使用AutoClearedValue类,当视图被销毁时,支持字段变为null,这很好,但我有一个线程(实际上是一个kotlin协程),它在完成后访问该值(使用autoCleared),但如果在它的工作完成之前,我导航到另一个片段(该片段的视图被销毁),然后它尝试访问该值,但由于它为null,我得到一个异常,因此崩溃。 我能做些什么 还需要为哪些变量使用此自动清除?我将其用于viewBinding和recyclerview适配器。当绑定视图时,让我们假设一个片段尝试类似于私有lateinit
还需要为哪些变量使用此自动清除?我将其用于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服务,那么您应该过度服务于响应,当响应到来时,数据不会通知您的片段,因为它已被销毁。这就是我正在做的,问题是我的代码在片段的视图被销毁后访问此值,但片段没有(导航到另一个片段)停止碎片销毁方法上的所有碎片观察员