FragmentManager is already executing transactions异常

在多Fragment 切换时报了这个异常, google 搜了一些答案都没能解决这个问题.
app 布局是这样的:刚开始是一个Fragment,里面有 viewpager ,viewpager 里面有三个 fragment, 然后是侧滑导航栏可切换到其他的 Fragment 但切换回来第一个界面的时候报了这个错误,不知道是布局的问题还是什么问题...是因为用了 v4 包的 Fragment 吗?看别人没用 v4包的 Fragment 不会报错,求解~

异常

 java.lang.IllegalStateException: FragmentManager is already executing transactions
                                                                         at android.support.v4.app.FragmentManagerImpl.execSingleAction(FragmentManager.java:1631)
                                                                         at android.support.v4.app.BackStackRecord.commitNowAllowingStateLoss(BackStackRecord.java:679)
                                                                         at android.support.v4.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.java:143)
                                                                         at android.support.v4.view.ViewPager.populate(ViewPager.java:1272)
                                                                         at android.support.v4.view.ViewPager.populate(ViewPager.java:1120)
                                                                         at android.support.v4.view.ViewPager.setOffscreenPageLimit(ViewPager.java:884)
                                                                         at com.muxistudio.jobs.ui.find.FindFragment.setupViewPager(FindFragment.java:69)
                                                                         at com.muxistudio.jobs.ui.find.FindFragment.initView(FindFragment.java:43)
                                                                         at com.muxistudio.jobs.ui.BaseFragment.onViewCreated(BaseFragment.java:42)
                                                                         at com.muxistudio.jobs.ui.find.FindFragment.onViewCreated(FindFragment.java:75)
                                                                         at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1132)
                                                                         at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1295)
                                                                         at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:801)
                                                                         at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1682)
                                                                         at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:541)
                                                                         at android.os.Handler.handleCallback(Handler.java:751)
                                                                         at android.os.Handler.dispatchMessage(Handler.java:95)
                                                                         at android.os.Looper.loop(Looper.java:154)
                                                                         at android.app.ActivityThread.main(ActivityThread.java:6077)
                                                                         at java.lang.reflect.Method.invoke(Native Method)
                                                                         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865)
                                                                         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)

代码

  • 第一个界面的 Fragment 中添加子 Fragment(在第二次切换到这个界面执行 mViewPager.setOffscreenPageLimit(2); 时抛出了这个异常)

 for (int i = 0; i < 3; i++) {
      mTabLayout.addTab(mTabLayout.newTab().setText(titleList.get(i)));
    }
    mTabLayout.setBackgroundColor(Color.WHITE);
    mTabLayout.setTabTextColors(Color.BLACK, getResources().getColor(R.color.colorAccent));
    List<Fragment> fragments = new ArrayList<>();
    fragments.add(InfoFragment.newInstance(1));
    fragments.add(InfoFragment.newInstance(2));
    fragments.add(InfoFragment.newInstance(3));
    FragmentAdapter adapter =
        new FragmentAdapter(getActivity().getSupportFragmentManager(), fragments, titleList);
    mViewPager.setAdapter(adapter);
    mViewPager.setOffscreenPageLimit(2);
    mTabLayout.setupWithViewPager(mViewPager);
  • 切换 fragment

  @Override public void showFragment(Fragment fragment) {
    getSupportFragmentManager().beginTransaction().replace(R.id.content, fragment).commit();
    Logger.d((fragment instanceof FindFragment) + "");
    if (fragment instanceof FindFragment) {
      invalidateOptionsMenu();
    }
  }
  • OnNavigationItemClick(mMainView是MainActivity实现的一个接口对象,用了 MVP,来回切换就会报这个异常...)

  @Override public void onNavigationItemClick(MenuItem item) {
    switch (item.getItemId()){
      case R.id.action_find:
        mMainView.showFragment(FindFragment.newInstance());
        break;
      case R.id.action_date:
        break;
      case R.id.action_person:
        mMainView.showFragment(CollectionFragment.newInstance());
        break;
      case R.id.action_discuss:
        break;
      case R.id.action_setting:
        mMainView.showSetting();
        break;
      case R.id.action_about:
        break;
    }
    mMainView.setTitle(item.getTitle().toString());
  }
阅读 18k
4 个回答
新手上路,请多包涵

楼主解决问题了没有,我和你遇到了一样的问题。

我的异常是:

java.lang.IllegalStateException: FragmentManager is already executing transactions
        at android.support.v4.app.FragmentManagerImpl.ensureExecReady(FragmentManager.java:2207)
        at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:2267)
        at android.support.v4.app.FragmentManagerImpl.executePendingTransactions(FragmentManager.java:814)
        at ......CqrPermission.requestPermissions(CqrPermission.java:103)
        at  ......CqrPermission.tryRequest(CqrPermission.java:70)
        at  ......CqrPermission.tryRequest(CqrPermission.java:48)
        at  .......MessageFragment.onCreate(MessageFragment.java:50)
        at android.support.v4.app.Fragment.performCreate(Fragment.java:2414)
        at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1418)
        at android.support.v4.app.FragmentTransition.addToFirstInLastOut(FragmentTransition.java:1195)
        at android.support.v4.app.FragmentTransition.calculateFragments(FragmentTransition.java:1078)
        at android.support.v4.app.FragmentTransition.startTransitions(FragmentTransition.java:117)
        at android.support.v4.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2408)
        at android.support.v4.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManager.java:2366)
        at android.support.v4.app.FragmentManagerImpl.execSingleAction(FragmentManager.java:2243)
        at android.support.v4.app.BackStackRecord.commitNowAllowingStateLoss(BackStackRecord.java:654)
        at android.support.v4.app.FragmentStatePagerAdapter.finishUpdate(FragmentStatePagerAdapter.java:168)
        at android.support.v4.view.ViewPager.populate(ViewPager.java:1244)
        at android.support.v4.view.ViewPager.populate(ViewPager.java:1092)
        at android.support.v4.view.ViewPager.onMeasure(ViewPager.java:1622)
        at android.view.View.measure(View.java:19937)
        at android.widget.LinearLayout.measureVertical(LinearLayout.java:928)
        at android.widget.LinearLayout.onMeasure(LinearLayout.java:657)
        at android.view.View.measure(View.java:19937)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6139)
        at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
        at android.support.v7.widget.ContentFrameLayout.onMeasure(ContentFrameLayout.java:143)
        at android.view.View.measure(View.java:19937)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6139)
        at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1489)
        at android.widget.LinearLayout.measureVertical(LinearLayout.java:775)
        at android.widget.LinearLayout.onMeasure(LinearLayout.java:657)
        at android.view.View.measure(View.java:19937)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6139)
        at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
        at android.view.View.measure(View.java:19937)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6139)
        at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1489)
        at android.widget.LinearLayout.measureVertical(LinearLayout.java:775)
        at android.widget.LinearLayout.onMeasure(LinearLayout.java:657)
        at android.view.View.measure(View.java:19937)
        at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6139)
        at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
        at com.android.internal.policy.DecorView.onMeasure(DecorView.java:729)
        at android.view.View.measure(View.java:19937)
        at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2442)
        at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1488)
        at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1747)
        at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1372)
        at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6782)
        at android.view.Choreographer$CallbackRecord.run(Choreographer.java:933)
        at android.view.Choreographer.doCallbacks(Choreographer.java:742)
2018-10-31 18:29:44.034 12062-12062/com.shallbuy.supplier E/CqrCrashHandler:     at android.view.Choreographer.doFrame(Choreographer.java:674)
        at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:919)
        at android.os.Handler.handleCallback(Handler.java:761)
        at android.os.Handler.dispatchMessage(Handler.java:98)
        at android.os.Looper.loop(Looper.java:156)
        at android.app.ActivityThread.main(ActivityThread.java:6605)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:999)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:889)
        at de.robv.android.xposed.XposedBridge.main(XposedBridge.java:103)

直接try...catch暴力解决:

            try {
                fragmentManager.executePendingTransactions();
                newFragment.requestPermissions(deniedPerms, REQUEST_CODE);
            } catch (IllegalStateException ignore) {
                //在主线程执行,避免华为BND-AL10等报IllegalStateException: FragmentManager is already executing transactions
            }

最近遇到类似情况供参考:

在非前台 状态调用viewpager setcurrentitem() 报出java.lang.IllegalStateException: FragmentManager is already executing transactions
解决方法:
  确保执行方法在前台状态, 简单方式使用livedata 来通知 ,livedata帮你轻松处理生命周期状态 
  var liveData: MutableLiveData<State> = MutableLiveData();
   liveData.observe(this, android.arch.lifecycle.Observer {
  it?.let {
   //todo fragment 切换动作
  }
})
liveData.postvalue(State())//触发切换
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题