当重新创建Activity时,lateinit属性不会被初始化

在我的活动我有一个lateinit属性称为controller ,我的片段使用。 该属性在Activity.onCreate()初始化。 我的Fragment通过onAttach()获取其参考。 然后FragmentFragment.onCreate()调用myActivity.controller

通常controller首先在Activity.onCreate()初始化,然后添加Fragment 。 所以这工作得很好。

但是,当我的Activity被杀害,它试图重新创建自己和它的碎片。 这导致在Activity.onCreate()初始化之前调用Fragment.onCreate() Activity.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)建议使用#onAttach(android.content.Context)

处理初始化之前使用对象的这种情况的最佳方法是使用isInitialized()属性进行检查,然后使用它。