在我的活动中,我有一个名为controller
的lateinit
属性,我的片段使用。此属性在 Activity.onCreate()
中初始化。我的Fragment
通过onAttach()
将其引用回我的Activity
。然后Fragment
在Fragment.onCreate()
中呼叫myActivity.controller
。
通常controller
首先在Activity.onCreate()
初始化,然后添加Fragment
。所以这很好用。
但是当我的Activity
被杀死时,它试图重建自己和它的碎片。这会导致在 Activity.onCreate()
中进行初始化之前调用Fragment.onCreate()
。
这些是我现在看到的选项:
- 在
super.onCreate()
之前初始化controller
(如果可能的话( - 将调用移至
myActivity.controller
到以后的生命周期回调,如onViewCreated()
- Kotlin 1.2 中提供
::controller.isInitialized
的东西
我在这里最好的选择是什么?
通过查看Fragment
生命周期,实际上最安全的一点是 #onActivityCreated(android.os.Bundle)
.
即使#onAttach()
看起来像是在Fragment
附加到Activity
时调用的,我不确定这是否完全保证,因为旧#onAttach(android.app.Activity)
已被弃用,建议使用新#onAttach(android.content.Context)
。
初始化之前使用对象的这种情况的最佳方法是检查 isInitialized(( 属性,然后使用它。