在片段中的 onResume 期间执行 popBackStackImmediate 时避免 IllegalStateException

Eri*_*lén 6 android android-fragments fragmentmanager fragment-backstack

我有一个带有片段的活动,以及该活动中用于管理片段的两个简单方法:pushFragmentImmediate()popFragmentImmediate()

\n\n
public void pushFragmentImmediate(Fragment fragment) {\n    FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();\n    transaction.replace(R.id.fragment_container, fragment)\n            .addToBackStack(null)\n            .commitNow();\n}\n\npublic void popFragmentImmediate() {\n    getSupportFragmentManager().popBackStackImmediate();\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

这些事务必须立即执行,因为遗留代码依赖于始终保持最新的返回堆栈。

\n\n

现在,如果满足某些条件,我会Fragment弹出一个窗口:onResume

\n\n
@Override\npublic void onResume() {\n    super.onResume();\n    if (condition) {\n        ((Main) getActivity()).popFragment();\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

这会产生错误。\n可以在不更改为 的情况下避免此错误popStackImmediate()popBackStack()popBackStackImmediate()或者当它不会返回错误时我可以转移到其他阶段吗?或者我以错误的方式思考这个问题?

\n\n

完整轨迹:

\n\n
java.lang.RuntimeException: Unable to resume activity {se.esillen.testproject/se.esillen.testproject.Main}: java.lang.IllegalStateException: FragmentManager is already executing transactions\n                                                           at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3433)\n                                                           at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3473)\n                                                           at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2736)\n                                                           at android.app.ActivityThread.-wrap12(ActivityThread.java)\n                                                           at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1481)\n                                                           at android.os.Handler.dispatchMessage(Handler.java:102)\n                                                           at android.os.Looper.loop(Looper.java:179)\n                                                           at android.app.ActivityThread.main(ActivityThread.java:6152)\n                                                           at java.lang.reflect.Method.invoke(Native Method)\n                                                           at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)\n                                                           at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)\n                                                        Caused by: java.lang.IllegalStateException: FragmentManager is already executing transactions\n                                                           at android.support.v4.app.FragmentManagerImpl.ensureExecReady(FragmentManager.java:2167)\n                                                           at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:2223)\n                                                           at android.support.v4.app.FragmentManagerImpl.popBackStackImmediate(FragmentManager.java:834)\n                                                           at android.support.v4.app.FragmentManagerImpl.popBackStackImmediate(FragmentManager.java:794)\n                                                           at se.esillen.testproject.Main.popFragment(Main.java:25)\n                                                           at se.esillen.testproject.TestFragment.onResume(TestFragment.java:26)\n                                                           at android.support.v4.app.Fragment.performResume(Fragment.java:2401)\n                                                           at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1465)\n                                                           at android.support.v4.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManager.java:1740)\n                                                           at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1809)\n                                                           at android.support.v4.app.FragmentManagerImpl.dispatchStateChange(FragmentManager.java:3217)\n                                                           at android.support.v4.app.FragmentManagerImpl.dispatchResume(FragmentManager.java:3181)\n                                                           at android.support.v4.app.FragmentController.dispatchResume(FragmentController.java:214)\n                                                           at android.support.v4.app.FragmentActivity.onResumeFragments(FragmentActivity.java:470)\n                                                           at android.support.v4.app.FragmentActivity.onPostResume(FragmentActivity.java:459)\n                                                           at android.support.v7.app.AppCompatActivity.onPostResume(AppCompatActivity.java:171)\n                                                           at android.app.Activity.performResume(Activity.java:6856)\n                                                           at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3410)\n                                                           at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3473)\xc2\xa0\n                                                           at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2736)\xc2\xa0\n                                                           at android.app.ActivityThread.-wrap12(ActivityThread.java)\xc2\xa0\n                                                           at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1481)\xc2\xa0\n                                                           at android.os.Handler.dispatchMessage(Handler.java:102)\xc2\xa0\n                                                           at android.os.Looper.loop(Looper.java:179)\xc2\xa0\n                                                           at android.app.ActivityThread.main(ActivityThread.java:6152)\xc2\xa0\n                                                           at java.lang.reflect.Method.invoke(Native Method)\xc2\xa0\n                                                           at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)\xc2\xa0\n                                                           at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)\n\n\xc2\xa0\n
Run Code Online (Sandbox Code Playgroud)\n