viewLifecycleOwner является нулевым в onActivityCreated - PullRequest
0 голосов
/ 06 октября 2019

Я обнаружил, что когда мое приложение остается в фоновом режиме, а затем пользователь запускает приложение, оно вызывает 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$1.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)

1 Ответ

0 голосов
/ 08 октября 2019

Ситуация произошла из-за того, что Activity был воссоздан системой после слишком долгого отсутствия активности.

Поскольку в этом Activity onCreate я инициализировал новый экземпляр Fragment, который я сказал в вопросе, у меня могло быть два Fragment экземпляра одновременно. Один был восстановлен системой, и таким образом он получил savedInstanceState, а другой был создан в Activity onCreate мной. Последнее вызывает проблемы и, следовательно, Мне не нужно создавать новый экземпляр Fragment, когда savedInstanceState не равно нулю.

...