lateinit 属性 未在重新创建 Activity 时初始化

lateinit property not initialized when Activity is re-created

在我的 Activity 中,我的片段使用了一个名为 controllerlateinit 属性。 此 属性 在 Activity.onCreate() 中初始化。我的 Fragment 通过 onAttach() 将其引用返回到我的 ActivityFragment 然后在 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() 属性 然后使用它。