我有一个关于安卓系统viewBinding的问题。通常,我都是这样用的
lateinit var binding: ActivityMainBinding
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)但我也看到有人这样用它
private val binding: ActivityMainBinding by lazy { ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)有什么不同吗?更好的方法是什么?
发布于 2022-07-13 12:46:38
有时,我们遇到这样一种情况,即我们希望避免对类中的某些字段进行初始化,直到实际需要为止。一个典型的例子可能是,沉重的单身汉。这就是使用懒散的时候。
通常,声明为具有非空类型的属性必须在构造函数中初始化.然而,这通常是不方便的。例如,可以通过依赖项注入或单元测试的安装方法初始化属性。在这种情况下,不能在构造函数中提供非空初始化器,但在引用类主体内的属性时仍然希望避免空检查。
要处理这种情况,可以使用lateinit修饰符标记该属性。
上面的场景是使用的场景,因为绑定是在以后的生命周期方法中初始化的。
在懒惰的情况下,它将在代码(即: setContentView )中需要时被调用,该代码再次位于生命周期方法中。
使用任何一个并坚持它。
发布于 2022-07-13 12:51:19
如果您在一个片段中,我不建议使用其中任何一个,因为您正以这种方式欢迎内存泄漏。在onDestroyView() (if片段)内部,您必须通过以下操作使ViewBinding实例为空
override fun onDestroyView() {
super.onDestroyView()
binding = null
}如果您使用的是lazy或lateinit,它将不允许您这样做,因为lateinit强制您具有不可空的值,而惰性强制您具有不可变的变量。
最好的方法是像文档中所描述的那样使用它
TLDR;
private var _binding: DialogStartcodeBinding? = null
private val binding get() = requireNotNull(_binding)
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View {
_binding = MyViewBinding.inflate(inflater, container, false)
return binding.root
}
override fun onDestroyView() {
super.onDestroyView()
_binding = null
}在这个活动中,我会在onDestroy()中使用片段和空值onDestroy(),或者使用您描述的任何版本。但是在文档中使用的是lateinit方法。
TLDR;使用任何使您更高兴的选项:)两者在Activity中都很好。
发布于 2022-07-13 13:18:52
嗨,迟到和懒惰有区别。
lateinit ->只允许使用var,并且只允许非空值。
Lazy ->对象只有在被调用时才会被创建,否则就不会有对象创建。只有val在懒惰中被允许。
https://stackoverflow.com/questions/72966253
复制相似问题