ANDROID-java.lang.IllegalStateException:在onSaveInstanceState之后无法执行此操作

ANDROID-java.lang.IllegalStateException:在onSaveInstanceState之后无法执行此操作,java,android,android-fragments,illegalstateexception,Java,Android,Android Fragments,Illegalstateexception,调用finish()然后重新打开应用程序时,出现上述错误。下面是在Backpressed()上管理导航的代码 loadView调用的方法负责根据用户选择的内容添加片段。当以0作为参数调用它时,它会添加默认片段 该方法如下: private void loadView(int position) { FragmentManager fragmentManager = getSupportFragmentManager(); Bundle fra

调用finish()然后重新打开应用程序时,出现上述错误。下面是在Backpressed()上管理导航的代码

loadView调用的方法负责根据用户选择的内容添加片段。当以0作为参数调用它时,它会添加默认片段

该方法如下:

    private void loadView(int position)
    {   
        FragmentManager fragmentManager = getSupportFragmentManager();
        Bundle fragmentArgs = new Bundle();

        if (drawerOpened)
            mDrawerLayout.closeDrawer(drawerHolderLayout);

        switch (position) {
        case 0:
            ProfileEditFragment activityList = new ProfileEditFragment();

            fragmentArgs.clear();
            fragmentArgs.putString(ProfileEditFragment.ARG_AGENT_ID, String.valueOf(prefClass.getAgentId()));
            fragmentArgs.putString(ProfileEditFragment.ARG_USERNAME, prefClass.getUsername());
            fragmentArgs.putString(ProfileEditFragment.ARG_PASSWORD, prefClass.getHashedPassword());
            fragmentArgs.putInt(ProfileEditFragment.ARG_OPERATION, ProfileEditFragment.LOAD_ALL_DATA);

            activityList.setArguments(fragmentArgs);
            fragmentManager.beginTransaction().add(R.id.main_activity_content, activityList).addToBackStack(null).commit();
            //activityList.retrieveActivityFromServer(ProfileEditFragment.LOAD_ALL_DATA);

            break;
        }
    }
执行此行时会发生异常:

fragmentManager.beginTransaction().add(R.id.main_activity_content, activityList).addToBackStack(null).commit();
但是,首次启动应用程序时不会发生此异常。它仅在调用finish()后重新启动时出现。值得一提的是,添加的第一个片段是LoginFragment。登录过程完成后,调用popBackstack,backstack变为空,并调用loadView(0)。那么,为什么它会在调用loadView时崩溃,而在添加LoginFragment时不会崩溃


提前感谢。

您确定片段提交发生在您认为的活动实例上吗

我不确定我的情况是否适用于您,但我确实有类似的症状,因为我只有在停止并重新启动活动后才会看到异常。我还发现亚历克斯·洛克伍德(Alex Lockwood)关于这个主题的(非常优秀)文章似乎对我没有帮助,就像你在评论中提到的那样

无论如何,我最终意识到是我初始化了一个长寿对象(在我的例子中是一个Facebook会话对象)并为其提供了回调活动的引用,从而导致了这个异常。只有当session.getActiveSession()指示会话不可用时,我才会初始化会话对象。这意味着在我第二次启动活动时,将使用上一个活动中的会话,以及指向上一个活动的回调。之前的活动已被销毁,并具有onSaveInstanceState。当回调被触发时,旧的活动将尝试获取其片段,然后发生异常。我一直在绞尽脑汁试图弄清楚为什么当新活动处于片段提交的有效状态时我会出现这种异常,但我一直在尝试将片段提交到一个旧的、已被破坏的活动

你可能没有使用Facebook会话本身,但也许你正在对一个长寿对象做类似的事情


祝你好运

在我的例子中,在应用程序移动到后台后,我打开了一个DialogFragment

您可以通过以下方式模拟此状态:打开请求,运行
Thread.sleep(2000)
,快速按智能手机上的“关机”(或按“菜单”按钮),然后“开机”(或打开应用程序)。如果请求出现错误且DialogFragment显示,它将在日志中写入:
java.lang.IllegalStateException:在onSaveInstanceState之后无法执行此操作
,相应的行是
DialogFragment.show(supportFragmentManager,标记)

我尝试了一个解决方案,它工作正常,但包含此错误。因此,再添加一个检查:

if (supportFragmentManager?.isStateSaved == false) {
    dialogFragment.show(supportFragmentManager, TAG)
}
在这种情况下,关闭屏幕并打开后,您将无法看到此对话框(遗憾地说),但您的应用程序不会崩溃

更新

对不起,旧答案已经过时了。看


在这种情况下,将显示对话框片段。

请阅读此内容,谢谢回复,我以前读过Alex Lockwood的帖子,这就是我在onPostResume中进行交易的原因。正如我所说,在我第一次发布应用程序时,一切都很好。添加LoginFragment,登录完成无误,调用popBackStack,它变为空,添加ActivityFragment时没有问题。但是如果用户离开应用程序(调用finish()),然后重新打开它,则添加LoginFragment,调用popBackStack,它将变为空,并且在我尝试添加ActivityFragment时会发生异常。为什么我可以第二次添加LoginFragment,而不是ActivityFragment?我现在正在讨论同样的问题。我读过Alex Lockwood的帖子,但它们似乎不适合我的情况。只有当我退出并从Facebook登录/注册活动中回来时,我才会看到这个问题。还在调查…@TommyVisic如果你看到这个,请通过skype与我联系:phiter_fernandes。我要和你谈谈你几年前做的一个游戏。
if (supportFragmentManager?.isStateSaved == false) {
    dialogFragment.show(supportFragmentManager, TAG)
}
public class CustomDialogFragment extends DialogFragment {

    @Override
    public void show(FragmentManager manager, String tag) {
        try {
            FragmentTransaction ft = manager.beginTransaction();
            ft.add(this, tag);
            ft.commit();
        } catch (IllegalStateException e) {
        }
    }
}