使用viewLifecycleOwner时屏幕旋转导致LiveData观察者重复注册如何解决
问题原因
- 核心问题是你没有在Fragment的
onDestroyView生命周期回调中正确清理Data Binding实例,每次屏幕旋转触发Fragment视图销毁重建时,旧的Binding实例没有被完全释放,同时新的Binding实例又完成了和ViewModel的绑定,最终同一个点击事件会被多份Binding实例响应,每旋转一次就多一个响应实例。 - 虽然你手动观察LiveData时用了
viewLifecycleOwner,理论上视图销毁时观察者会自动移除,但Data Binding内部的绑定关系如果没有主动清理,会存在残留的引用,同时绑定的点击事件回调也会残留,导致重复触发。
解决方案
你需要在DashboardFragment中重写onDestroyView方法,完成Binding的清理工作,具体代码如下:
override fun onDestroyView() { // 先清理Binding中的ViewModel引用和生命周期所有者 binding.apply { lifecycleOwner = null dashboardViewModel = null } // 置空Binding实例 _binding = null super.onDestroyView() }
可选优化点
- 检查项目中Fragment的依赖版本,如果是较老的Androidx Fragment版本,存在
viewLifecycleOwner相关的观察者清理bug,升级到Fragment 1.3.0及以上稳定版本即可解决。 - 如果你不需要在配置变更时重建视图,也可以在AndroidManifest.xml中对应Activity节点添加
android:configChanges="orientation|screenSize|screenLayout|keyboardHidden"属性,避免旋转时Activity和Fragment视图重建,这种方式需要自己处理配置变更后的布局适配,适合界面适配简单的场景。
内容的提问来源于stack exchange,提问作者FrankGG
相关产品推荐
相关产品推荐

