【问题标题】:lateinit property not initialized when Activity is re-created重新创建 Activity 时未初始化 lateinit 属性
【发布时间】:2018-01-08 05:43:51
【问题描述】:

在我的 Activity 中,我有一个名为 controllerlateinit 属性,我的 Fragment 使用该属性。 此属性在Activity.onCreate() 中初始化。我的Fragment 通过onAttach() 将其引用返回到我的Activity。然后FragmentFragment.onCreate() 中调用myActivity.controller

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

但是当我的Activity 被杀死时,它会尝试重新创建自己及其碎片。这会导致在Activity.onCreate() 中进行初始化之前调用Fragment.onCreate()

这些是我现在看到的选项:

  • super.onCreate() 之前初始化controller(如果可能的话)
  • 将对myActivity.controller 的调用移至稍后的生命周期回调,如onViewCreated()
  • ::controller.isInitialized 在 Kotlin 1.2 中可用

我最好的选择是什么?

【问题讨论】:

  • by lazy { /* initialization code */ }怎么样?
  • @XavierRubioJansana 这实际上解决了我的崩溃问题,但我认为这不是解决此问题的通用方法。

标签: android android-fragments kotlin kotlin-lateinit


【解决方案1】:

通过查看Fragment lifecycle,实际上最安全的一点是#onActivityCreated(android.os.Bundle)

即使#onAttach() 看起来像是在将Fragment 附加到Activity 时调用它,我也不确定这是否完全可以保证,因为旧的#onAttach(android.app.Activity) 已被弃用,而新的@推荐987654324@。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-03-03
      • 1970-01-01
      • 2020-12-31
      • 2021-06-11
      • 2017-12-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多