onActivityCreated 中的 viewLifecycleOwner 为 null
viewLifecycleOwner is null in onActivityCreated
我发现当我的应用程序在后台停留很长时间然后用户启动该应用程序时,这会导致 IllegalStateException
。抛出此异常,因为 viewLifecycleOwner
为空。我想知道这怎么可能?
代码如下所示:在 Fragment
的 onActivityCreated
中,我得到:
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
在闲置时间过长后被系统重新创建。
因为在 Activity
的 onCreate
中我初始化了我在问题中提到的 Fragment
的一个新实例,我可能有两个 Fragment
实例同时。一个是系统恢复的,所以得到了savedInstanceState
,另一个是我在Activity
的onCreate
中创建的。最后一个会导致问题,因此 当 savedInstanceState
不为空时,我不需要创建 Fragment
的新实例。
我发现当我的应用程序在后台停留很长时间然后用户启动该应用程序时,这会导致 IllegalStateException
。抛出此异常,因为 viewLifecycleOwner
为空。我想知道这怎么可能?
代码如下所示:在 Fragment
的 onActivityCreated
中,我得到:
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
在闲置时间过长后被系统重新创建。
因为在 Activity
的 onCreate
中我初始化了我在问题中提到的 Fragment
的一个新实例,我可能有两个 Fragment
实例同时。一个是系统恢复的,所以得到了savedInstanceState
,另一个是我在Activity
的onCreate
中创建的。最后一个会导致问题,因此 当 savedInstanceState
不为空时,我不需要创建 Fragment
的新实例。