【问题标题】:sometime get IllegalStateException: Can not perform this action after onSaveInstanceState after checked inFinishing有时会得到 IllegalStateException: Can not perform this action after onSaveInstanceState after check inFinishing
【发布时间】:2017-05-18 21:44:25
【问题描述】:

之前有过这种情况并通过检查活动 isFinishing 或是否已调用 onSaveInstanceState 来解决。

但有时它通过检查后仍然会发生。它只是一个列表,单击该项目将打开另一个片段以显示详细信息。

在 Activity 的处理程序中,isFinishing() 和 onSaveInstanceState 是否已被调用并正常,但 ft.commit() 仍然会导致 IllegalStateException。

由于列表仍在显示中,怎么会发生这种情况?还有什么可以用来预防呢?

同样,在大多数情况下它工作正常,但有时会在此行看到报告的崩溃。

Fatal Exception: java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
   at android.support.v4.app.FragmentManagerImpl.checkStateLoss(FragmentManager.java:1832)
   at android.support.v4.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1850)
   at android.support.v4.app.BackStackRecord.commitInternal(BackStackRecord.java:643)
   at android.support.v4.app.BackStackRecord.commit(BackStackRecord.java:603)
   at com.zeta.MainActivity.showMessageDetailsFragment(MainActivity.java:4522)
   at com.zeta.messagelist.ListFragment.onListItemClick(ListFragment.java:1945)
   at android.support.v4.app.ListFragment$2.onItemClick(ListFragment.java:60)
   at android.widget.AdapterView.performItemClick(AdapterView.java:310)
   at android.widget.AbsListView.performItemClick(AbsListView.java:1145)
   at android.widget.AbsListView$PerformClick.run(AbsListView.java:3073)
   at android.widget.AbsListView$3.run(AbsListView.java:3910)
   at android.os.Handler.handleCallback(Handler.java:746)
   at android.os.Handler.dispatchMessage(Handler.java:95)
   at android.os.Looper.loop(Looper.java:148)
   at android.app.ActivityThread.main(ActivityThread.java:5443)
   at java.lang.reflect.Method.invoke(Method.java)
   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:728)
   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)



 @Override
 protected void onSaveInstanceState(Bundle outState) {
    mInSaveInstanceState = true;
    super.onSaveInstanceState(outState);
 }


 private void showMessageDetailsFragment(MessageContext messageContext) {
    if ((!mInSaveInstanceState) && !isFinishing()) {                        
        MessageDetailsFragment detailsFragment = new MessageDetailsFragment(messageContext);

        FragmentManager fm = getSupportFragmentManager();
        FragmentTransaction ft = fm.beginTransaction();
        ft.replace(R.id.details_fragment_holder, detailsFragment, "DETAILS_FRAGMENT");
        ft.addToBackStack("DETAILS_FRAGMENT");   
        ft.setCustomAnimations(R.anim.hold, FragmentTransaction.TRANSIT_NONE,
                        R.anim.slide_left_in, FragmentTransaction.TRANSIT_NONE);
        ft.show(detailsFragment);
        ft.commit();  //<=== java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState

【问题讨论】:

  • 如果你使用replace,那你为什么还要使用show?删除节目并尝试
  • 之前是 add(),添加和替换都有这个异常。

标签: android illegalstateexception


【解决方案1】:

试试 ft.commitAllowingStateLoss() 代替 ft.commit()

【讨论】:

  • 谢谢皮特!不想在不知道为什么发生的情况下使用 commitAllowingStateLoss()。
  • 您是否在列表点击处理程序的后台线程中运行任何东西?
猜你喜欢
  • 2013-12-19
  • 2012-07-25
  • 2012-08-15
  • 1970-01-01
  • 1970-01-01
  • 2019-05-03
  • 2022-02-09
  • 2018-10-21
  • 2019-07-20
相关资源
最近更新 更多