Fragment中View Binding双声明与单声明绑定方式的区别是什么
两种View Binding写法的差异说明
两种写法的运行效果并不完全一致,不建议使用第二种单binding声明的写法替换官方推荐的双声明结构,具体差异如下:
- 空值清理时机错误,存在内存泄漏风险
Fragment的View生命周期和实例生命周期是相互独立的:当Fragment被压入回退栈时,仅会销毁View触发onDestroyView,并不会销毁Fragment实例触发onDestroy。第二种写法直到onDestroy才清空binding引用,会导致View销毁后绑定对象仍持有整个View树的引用,造成内存泄漏。 - 访问安全性更低,易出现逻辑错误或崩溃
官方双声明结构通过自定义getter的不可变属性binding自动解包,在View生命周期内访问不需要额外判空,也规避了手动解包的失误风险。第二种写法每次访问binding都需要手动加!!解包,且在onDestroyView执行后、onDestroy执行前的区间,binding还未被置空但关联的View已经废弃,此时访问会拿到无效的绑定对象,触发意料之外的逻辑错误甚至崩溃。 - 存在冗余逻辑,易混淆布局加载流程
第二种写法在Fragment构造函数中传入了布局R.layout.my_fragment_layout,但后续又自行inflate绑定对象返回根View,构造传入的布局参数完全无效,属于冗余代码,容易误导后续维护者对布局加载逻辑的判断。
内容的提问来源于stack exchange,提问作者morteza mgh
相关产品推荐
相关产品推荐

