重新创建活动时未初始化 lateinit 属性



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

最新更新