6

I have a single Activity with fragments and two simple methods inside the activity for managing fragments: pushFragmentImmediate() and popFragmentImmediate().

public void pushFragmentImmediate(Fragment fragment) {
    FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
    transaction.replace(R.id.fragment_container, fragment)
            .addToBackStack(null)
            .commitNow();
}

public void popFragmentImmediate() {
    getSupportFragmentManager().popBackStackImmediate();
}

These transactions must execute immediately because of legacy code which depend on the back stack being up to date at all times.

Now I have a Fragment which pops off during onResume if some condition is satisfied:

@Override
public void onResume() {
    super.onResume();
    if (condition) {
        ((Main) getActivity()).popFragment();
    }
}

This gives an error. Can this error be avoided without changing popStackImmediate() to popBackStack()? Or can I move popBackStackImmediate() to some other phase when it will not return an error? Or am I thinking about this in the wrong way?

Full trace:

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

 
ʍѳђઽ૯ท
  • 16,646
  • 7
  • 53
  • 108
Erik Sillén
  • 337
  • 2
  • 13

0 Answers0