lateinit 属性 未在重新创建 Activity 时初始化
lateinit property not initialized when Activity is re-created
在我的 Activity 中,我的片段使用了一个名为 controller
的 lateinit
属性。
此 属性 在 Activity.onCreate()
中初始化。我的 Fragment
通过 onAttach()
将其引用返回到我的 Activity
。 Fragment
然后在 Fragment.onCreate()
.
中调用 myActivity.controller
一般在Activity.onCreate()
中先初始化controller
,然后再添加Fragment
。所以这很好用。
但是当我的 Activity
被杀死时,它会尝试重新创建自己及其碎片。这导致 Fragment.onCreate()
在 初始化发生在 Activity.onCreate()
之前被调用 。
这些是我现在看到的选项:
- 在
super.onCreate()
之前初始化 controller
(如果可能的话)
- 将对
myActivity.controller
的调用移至稍后的生命周期回调,如 onViewCreated()
- Kotlin 1.2 中
::controller.isInitialized
可用的东西
我最好的选择是什么?
通过查看 Fragment
lifecycle, in fact the safest point to do it will be #onActivityCreated(android.os.Bundle)
。
即使 #onAttach()
看起来像是在 Fragment
附加到 Activity
时调用的,我不确定这是否完全有保证,因为旧的 [=建议使用 18=]。
处理在初始化之前使用对象的这种情况的最佳方法是检查 isInitialized() 属性 然后使用它。
在我的 Activity 中,我的片段使用了一个名为 controller
的 lateinit
属性。
此 属性 在 Activity.onCreate()
中初始化。我的 Fragment
通过 onAttach()
将其引用返回到我的 Activity
。 Fragment
然后在 Fragment.onCreate()
.
myActivity.controller
一般在Activity.onCreate()
中先初始化controller
,然后再添加Fragment
。所以这很好用。
但是当我的 Activity
被杀死时,它会尝试重新创建自己及其碎片。这导致 Fragment.onCreate()
在 初始化发生在 Activity.onCreate()
之前被调用 。
这些是我现在看到的选项:
- 在
super.onCreate()
之前初始化controller
(如果可能的话) - 将对
myActivity.controller
的调用移至稍后的生命周期回调,如onViewCreated()
- Kotlin 1.2 中
::controller.isInitialized
可用的东西
我最好的选择是什么?
通过查看 Fragment
lifecycle, in fact the safest point to do it will be #onActivityCreated(android.os.Bundle)
。
即使 #onAttach()
看起来像是在 Fragment
附加到 Activity
时调用的,我不确定这是否完全有保证,因为旧的 [=建议使用 18=]。
处理在初始化之前使用对象的这种情况的最佳方法是检查 isInitialized() 属性 然后使用它。