onActivityCreated 中的 viewLifecycleOwner 为 null

viewLifecycleOwner is null in onActivityCreated

我发现当我的应用程序在后台停留很长时间然后用户启动该应用程序时,这会导致 IllegalStateException。抛出此异常,因为 viewLifecycleOwner 为空。我想知道这怎么可能?

代码如下所示:在 FragmentonActivityCreated 中,我得到:

val mapFragment = (childFragmentManager.findFragmentById(R.id.mapFragment) as SupportMapFragment)
mapFragment.getMapAsync {
    myViewModel.someValue.observe(viewLifecycleOwner, Observer {
        doStuff()
    })
}

正如我上面写的,IllegalStateException 仅当应用程序在最近的应用程序中保持 很多时间 时才会抛出。

我不知道为什么,我只是假设在将 Google Map Fragment(嵌套在 Fragment 中)与 LiveData 一起使用时会发生一些意想不到的事情。类似于一系列复杂生命周期的问题(Activity、Fragment、ViewModel、LiveDate、GoogleMapFragment)

堆栈跟踪:

java.lang.IllegalStateException: 
  at androidx.fragment.app.Fragment.getViewLifecycleOwner (Fragment.java:329)
  at com.packagename.myapp.view.fragments.ObjectFragment.init (ObjectFragment.kt:69)
  at com.packagename.myapp.fragments.ObjectFragment.access$init (ObjectFragment.kt:28)
  at com.packagename.myapp.fragments.ObjectFragment$onActivityCreated.onMapReady (ObjectFragment.kt:58)
  at com.google.android.gms.maps.zzak.zza (Unknown Source:2)
  at com.google.android.gms.maps.internal.zzaq.dispatchTransaction (Unknown Source:12)
  at com.google.android.gms.internal.maps.zzb.onTransact (Unknown Source:12)
  at android.os.Binder.transact (Binder.java:675)
  at cw.b (com.google.android.gms.dynamite_mapsdynamite@19275081@19.2.75 (100400-269183835):14)
  at com.google.android.gms.maps.internal.be.a (com.google.android.gms.dynamite_mapsdynamite@19275081@19.2.75 (100400-269183835):4)
  at com.google.maps.api.android.lib6.impl.bj.run (com.google.android.gms.dynamite_mapsdynamite@19275081@19.2.75 (100400-269183835):4)
  at android.os.Handler.handleCallback (Handler.java:873)
  at android.os.Handler.dispatchMessage (Handler.java:99)
  at android.os.Looper.loop (Looper.java:214)
  at android.app.ActivityThread.main (ActivityThread.java:7050)
  at java.lang.reflect.Method.invoke (Native Method)
  at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run (RuntimeInit.java:493)
  at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:965)

出现这种情况是因为 Activity 在闲置时间过长后被系统重新创建。

因为在 ActivityonCreate 中我初始化了我在问题中提到的 Fragment 的一个新实例,我可能有两个 Fragment 实例同时。一个是系统恢复的,所以得到了savedInstanceState,另一个是我在ActivityonCreate中创建的。最后一个会导致问题,因此 savedInstanceState 不为空时,我不需要创建 Fragment 的新实例。