terrakok/Cicerone

AppNavigator applyCommandsSync

lUjek-Sh opened this issue · 5 comments

Cicerone Version: 7.0
I keep getting an error related to applyCommandsSync.

Fatal Exception: java.lang.IllegalStateException: FragmentManager has been destroyed
       at androidx.fragment.app.FragmentManager.ensureExecReady(FragmentManager.java:1936)
       at androidx.fragment.app.FragmentManager.execPendingActions(FragmentManager.java:1996)
       at androidx.fragment.app.FragmentManager.executePendingTransactions(FragmentManager.java:600)
       at com.github.terrakok.cicerone.androidx.AppNavigator.applyCommandsSync(AppNavigator.kt:34)
       at org.desyatka.client.ui.activity.ParentActivity$navigator$1.applyCommandsSync(ParentActivity.kt:82)
       at com.github.terrakok.cicerone.androidx.AppNavigator$applyCommands$1.run(AppNavigator.kt:29)
       at android.os.Handler.handleCallback(Handler.java:938)
       at android.os.Handler.dispatchMessage(Handler.java:99)
       at android.os.Looper.loop(Looper.java:223)
       at android.app.ActivityThread.main(ActivityThread.java:7660)
       at java.lang.reflect.Method.invoke(Method.java)
       at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)

Lines of code from the AppNavigator file lines 27 to 46.

    override fun applyCommands(commands: Array<out Command>) {
        mainHandler.post {
            applyCommandsSync(commands)
        }
    }

    protected open fun applyCommandsSync(commands: Array<out Command>) {
        fragmentManager.executePendingTransactions()

        //copy stack before apply commands
        copyStackToLocal()

        for (command in commands) {
            try {
                applyCommand(command)
            } catch (e: RuntimeException) {
                errorOnApplyCommand(command, e)
            }
        }
    }

My code in ParentActivity lines 78 to 85.

    private val navigatorHolder = provideNavigatorHolder()

    private val navigator: Navigator = object : AppNavigator(this, R.id.container_parent) {
        override fun applyCommandsSync(commands: Array<out Command>) {
            super.applyCommandsSync(commands) - this ParentActivity.kt:82
            supportFragmentManager.executePendingTransactions()
        }
    }

What could be the problem?

override fun applyCommands(commands: Array) {
mainHandler.post {
applyCommandsSync(commands)
}
}
Run this on UI thread with using runOnUiThread(runnable);
The problem should get solved.

override fun applyCommands(commands: Array) {
mainHandler.post {
applyCommandsSync(commands)
}
}
Run this on UI thread with using runOnUiThread(runnable);
The problem should get solved.

Ok. I try this tomorrow.

override fun applyCommands(commands: Array) {
mainHandler.post {
applyCommandsSync(commands)
}
}
Run this on UI thread with using runOnUiThread(runnable);
The problem should get solved.

Your solution didn't help.

Fatal Exception: java.lang.IllegalStateException: FragmentManager has been destroyed
       at androidx.fragment.app.FragmentManager.ensureExecReady(FragmentManager.java)
       at androidx.fragment.app.FragmentManager.execPendingActions(FragmentManager.java)
       at androidx.fragment.app.FragmentManager.executePendingTransactions(FragmentManager.java)
       at com.github.terrakok.cicerone.androidx.AppNavigator.applyCommandsSync(AppNavigator.java)
       at org.desyatka.client.ui.activity.ParentActivity$navigator$1.applyCommands$lambda-0(ParentActivity.java)
       at org.desyatka.client.ui.activity.ParentActivity$navigator$1.lambda$yEVhX-TOAK8HRAEcgBlGOkQkqHg(ParentActivity.java)
       at org.desyatka.client.ui.activity.-$$Lambda$ParentActivity$navigator$1$yEVhX-TOAK8HRAEcgBlGOkQkqHg.run(-.java)
       at android.os.Handler.handleCallback(Handler.java)
       at android.os.Handler.dispatchMessage(Handler.java)
       at android.os.Looper.loop(Looper.java)
       at android.app.ActivityThread.main(ActivityThread.java)
       at java.lang.reflect.Method.invoke(Method.java)
       at java.lang.reflect.Method.invoke(Method.java:372)
       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java)

Cicerone Version 7.0
Приложение крашится в проде. В Firebase Crashlytics этот баг находится на первом месте по количеству крашей.

Fatal Exception: java.lang.IllegalStateException: FragmentManager has been destroyed
       at androidx.fragment.app.FragmentManager.ensureExecReady(FragmentManager.java:1936)
       at androidx.fragment.app.FragmentManager.execPendingActions(FragmentManager.java:1996)
       at androidx.fragment.app.FragmentManager.executePendingTransactions(FragmentManager.java:600)
       at com.github.terrakok.cicerone.androidx.AppNavigator.applyCommandsSync(AppNavigator.java:34)
       at com.github.terrakok.cicerone.androidx.AppNavigator$applyCommands$1.run(AppNavigator.java:29)
       at android.os.Handler.handleCallback(Handler.java:938)
       at android.os.Handler.dispatchMessage(Handler.java:99)
       at android.os.Looper.loop(Looper.java:246)
       at android.app.ActivityThread.main(ActivityThread.java:8506)
       at java.lang.reflect.Method.invoke(Method.java)
       at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:602)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1130)

Приложение крашится в проде. В Firebase Crashlytics этот баг находится на первом месте по количеству крашей.

I use
private val navigator: Navigator = object : AppNavigator(this, R.id.container_parent){}
not use
override fun applyCommandsSync

it help me