hiroki_abe
@hiroki_abe

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

Androidアプリ IllegalStateExceptionエラーについて

解決したいこと

※今回初めての投稿となります。不備等あればご指摘いただけますと幸いです。

現在、KotlinでAndroidアプリを作成、PlayStoreで配布しています。
アプリ起動時にプライバシーポリシーへの同意画面を表示するようになっていますが、表示中にアプリが落ちます。
この原因を突き止めたいと考えております。

分かっていること

・この現象は必ず起きるわけではなく、同型番、同OSバージョンで再現するスマホとしないスマホがあります。また、開発機として手元にあるスマホでは再現しません。
・この現象はAndroidOSバージョン11,13,14で起きています。
・アプリをアンインストールして、再度インストールしても改善しません。

発生している問題・エラー

以下のログはPlayConsoleの「クラッシュとANR」から取得したものです。

Exception java.lang.IllegalStateException:
  at androidx.fragment.app.Fragment.getParentFragmentManager (Fragment.java:1107)
  at androidx.navigation.fragment.NavHostFragment$Companion.findNavController (NavHostFragment.kt:375)
  at androidx.navigation.fragment.FragmentKt.findNavController (Fragment.kt:29)
  at [パッケージ名].ui.privacy.PrivacyPolicyAgreementFragment$onResume$1.invokeSuspend (PrivacyPolicyAgreementFragment.kt:201)
  at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith (ContinuationImpl.kt:33)
  at kotlinx.coroutines.DispatchedTask.run (DispatchedTask.kt:106)
  at android.os.Handler.handleCallback (Handler.java:942)
  at android.os.Handler.dispatchMessage (Handler.java:99)
  at android.os.Looper.loopOnce (Looper.java:240)
  at android.os.Looper.loop (Looper.java:351)
  at android.app.ActivityThread.main (ActivityThread.java:8411)
  at java.lang.reflect.Method.invoke
  at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run (RuntimeInit.java:568)
  at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1013)

該当するソースコード

クラッシュログ中のPrivacyPolicyAgreementFragment.ktから抜粋しています。
既にプライバシーポリシーに同意済みかチェックし、同意済みならログイン画面へ遷移するようにしています。

    override fun onResume() {

        super.onResume()
        pref = Pref(requireContext())

        (activity as MainActivity?)!!.enableBottomBar(false)
        (activity as MainActivity?)?.visibletoolbar(false)

        suspend fun res():Boolean =
            withContext(Dispatchers.Default)
            {
                var b = false
                PrivacyVersion?.let { p ->
                    try{
                        var privacy = db.dao_privacy.get()
                        if(privacy.agree && p == privacy.version){
                            b = true
                        } else {
                        }

                    }
                    catch (e:Exception){
                        Log.v("VersionUpdate", e.message.toString())
                    }

                }
                return@withContext b
            }

        GlobalScope.launch(Dispatchers.Main)
        {
            var b =  res()
            if(b){
                if (findNavController().currentDestination?.id == R.id.nav_privacy) {
                    var action = PrivacyPolicyAgreementFragmentDirections.actionNavPrivacyToNavLogin()
                    findNavController().navigate(action)
                }
            }
        }
    }

クラッシュログから下記の部分でエラーが出ているように考えております。
※現在の画面がプライバシーポリシー同意画面かをチェックしています。

                if (findNavController().currentDestination?.id == R.id.nav_privacy) {

この部分でエラーとなる際の原因として何が考えられるかを知りたく、
お力をお借りできますと幸いです。よろしくお願いいたします。

0

1Answer

Comments

  1. @hiroki_abe

    Questioner

    ご回答いただきありがとうございます。
    色々と調べていく中で結果的には以下のように変更することで問題は発生しなくなりました。

            //GlobalScope.launch(Dispatchers.Main)
            viewLifecycleOwner.lifecycleScope.launch(Dispatchers.Main)
    

    CoroutineScopeの違い?ということになるかと思いますが
    いまいちこの部分の挙動が理解できていません・・・。
    同じ型番、同じOSバージョンのスマホで現象が再現するものとしないものがあるのも不明なままです・・・。
    もしこのあたりご存知でしたらご教示いただけますと幸いです。

    ※一旦、問題は解消されたので解決とさせていただきます。

Your answer might help someone💌