IllegalStateException:在 onSaveInstanceState 和 onActivityResult 之后无法执行此操作

Posted

技术标签:

【中文标题】IllegalStateException:在 onSaveInstanceState 和 onActivityResult 之后无法执行此操作【英文标题】:IllegalStateException: Can not perform this action after onSaveInstanceState with onActivityResult 【发布时间】:2019-05-30 16:55:04 【问题描述】:

我是 android 开发的新手。我有一个问题。我尝试了最后几个小时,但我无法弄清楚这一点。如果是这样,我有一个受欢迎的问题。 IllegalStateException: Can not perform this action after onSaveInstanceState with ViewPager但因缺乏Android开发经验而失败。

代码如下:

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) 
        if (requestCode == 1) 
            if(resultCode == RESULT_OK) 
                MyCustomDialogFragment newPopup = new MyCustomDialogFragment();
                newPopup.setMyClickListener(MainActivity.this);
                FragmentManager fragmentManager = getSupportFragmentManager();
                newPopup.show(fragmentManager, "CashReceivePopup");  
           
       
   

这是错误:

01-04 05:08:57.010 13609-13609/com.nazmul.aznazgame.bitlife D/AndroidRuntime: 关闭 VM 01-04 05:08:57.068 13609-13609/com.nazmul.aznazgame.bitlife E/AndroidRuntime:致命 例外:主要 进程:com.nazmul.aznazgame.bitlife,PID:13609 java.lang.RuntimeException: 传递结果失败 ResultInfowho=null, request=4, result=-1, data=Intent (有额外的) 到活动 com.nazmul.aznazgame.bitlife/com.nazmul.aznazgame.bitlife.MainActivity: java.lang.IllegalStateException:之后无法执行此操作 onSaveInstanceState 在 android.app.ActivityThread.deliverResults(ActivityThread.java:3574) 在 android.app.ActivityThread.handleSendResult(ActivityThread.java:3617) 在 android.app.ActivityThread.access$1300(ActivityThread.java:151) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1352) 在 android.os.Handler.dispatchMessage(Handler.java:102) 在 android.os.Looper.loop(Looper.java:135) 在 android.app.ActivityThread.main(ActivityThread.java:5254) 在 java.lang.reflect.Method.invoke(本机方法) 在 java.lang.reflect.Method.invoke(Method.java:372) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698) 原因:java.lang.IllegalStateException:onSaveInstanceState 后无法执行此操作 在 android.support.v4.app.FragmentManagerImpl.checkStateLoss(FragmentManager.java:2053) 在 android.support.v4.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:2079) 在 android.support.v4.app.BackStackRecord.commitInternal(BackStackRecord.java:678) 在 android.support.v4.app.BackStackRecord.commit(BackStackRecord.java:632) 在 android.support.v4.app.DialogFragment.show(DialogFragment.java:143) 在 com.nazmul.aznazgame.bitlife.MainActivity.showEducationDialog(MainActivity.java:1716) 在 com.nazmul.aznazgame.bitlife.MainActivity.manageActivity(MainActivity.java:604) 在 com.nazmul.aznazgame.bitlife.MainActivity.onActivityResult(MainActivity.java:580) 在 android.app.Activity.dispatchActivityResult(Activity.java:6192) 在 android.app.ActivityThread.deliverResults(ActivityThread.java:3570) 在 android.app.ActivityThread.handleSendResult(ActivityThread.java:3617) 在 android.app.ActivityThread.access$1300(ActivityThread.java:151) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1352) 在 android.os.Handler.dispatchMessage(Handler.java:102) 在 android.os.Looper.loop(Looper.java:135) 在 android.app.ActivityThread.main(ActivityThread.java:5254) 在 java.lang.reflect.Method.invoke(本机方法) 在 java.lang.reflect.Method.invoke(Method.java:372) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698) 01-04 05:08:59.825 13609-13651/com.nazmul.aznazgame.bitlife I/CrashlyticsCore:Crashlytics 报告上传完成: 5C2EEA4F018E-0001-3529-63E978D09744 01-04 05:08:59.955 13609-13609/com.nazmul.aznazgame.bitlife I/Process:发送信号。 PID:13609 SIG:9

【问题讨论】:

您使用的是什么版本的支持库? @ianhanniballake 您要查看哪个库版本?我不明白你 @ianhanniballake 我正在使用import android.support.v4.app.FragmentManager;这是你的答案吗? 支持库是指android.support库。您可以在 build.gradle 文件中找到它。虽然当操作系统杀死你以前的Activity时会抛出这个异常。 【参考方案1】:

在您的 onActivityResult() 方法中执行任何 FragmentTransactions 之前,您必须调用 super.onActivityResult(requestCode, resultCode, data),因为该调用是“解锁”FragmentManager 并说明您处于执行 FragmentTransactions 的有效状态。

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) 
        // Add this line
        super.onActivityResult(requestCode, resultCode, data);

        // This all remains the same
        if (requestCode == 1) 
            if(resultCode == RESULT_OK) 
                MyCustomDialogFragment newPopup = new MyCustomDialogFragment();
                newPopup.setMyClickListener(MainActivity.this);
                FragmentManager fragmentManager = getSupportFragmentManager();
                newPopup.show(fragmentManager, "CashReceivePopup");  
           
       
   

【讨论】:

这与这个问题无关。获取信息:我使用onActivityResultdata 发送到以前的活动,但我似乎花了太多时间发送transaction activity。有没有像 iosdelegate 用于将数据发送回 ViewController)这样的东西,它变得更快,但在 android 中其他任何东西。谢谢【参考方案2】:

这是一个常见的问题。您有 2 个选项来处理这个问题。

    您可以覆盖show() 方法并将其内容放在try-catch 块中

    您以下列方式显示对话框

     FragmentManager fm = getSupportFragmentManager();
     MyDialog d = new MyDialog();
     FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
     ft.add(d, "dialog");
     ft.commitAllowingStateLoss();
    

【讨论】:

以上是关于IllegalStateException:在 onSaveInstanceState 和 onActivityResult 之后无法执行此操作的主要内容,如果未能解决你的问题,请参考以下文章

使用Android O的画中画功能

AsyncTask上的IllegalStateException [重复]

IllegalStateException:在使用 ViewPager onSaveInstanceState 后无法执行此操作

java.lang.IllegalStateException:无法在 localhost:49167 连接到 Ryuk

错误:java.lang.IllegalStateException:没有包含点

为啥我在停止 MediaRecorder 时会收到 IllegalStateException?