onActivityResult 中的非法状态异常

Posted

技术标签:

【中文标题】onActivityResult 中的非法状态异常【英文标题】:Illegal state exception in onActivityResult 【发布时间】:2017-08-09 09:41:25 【问题描述】:

我在片段中有这段代码:

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent resultData) 
        if (requestCode == READ_REQUEST && resultCode == Activity.RESULT_OK) 
            Uri uri;
            if (resultData != null) 
                uri = resultData.getData();
                getChildFragmentManager().beginTransaction().add(new MyFragment(), TAG).commit();
            
        
    

但是 IllegalStateException 会导致崩溃。活动在 onSaveInstanceState() 之后无法创建/恢复事务。在 onActivityResult() 中从另一个片段开始的正确方法是什么?

Logcat:

03-17 18:55:37.372 26127 26127 E androidRuntime: Caused by: java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
03-17 18:55:37.372 26127 26127 E AndroidRuntime:    at android.app.FragmentManagerImpl.checkStateLoss(FragmentManager.java:1434)
03-17 18:55:37.372 26127 26127 E AndroidRuntime:    at android.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1452)
03-17 18:55:37.372 26127 26127 E AndroidRuntime:    at android.app.BackStackRecord.commitInternal(BackStackRecord.java:708)
03-17 18:55:37.372 26127 26127 E AndroidRuntime:    at android.app.BackStackRecord.commit(BackStackRecord.java:672)
03-17 18:55:37.372 26127 26127 E AndroidRuntime:    at com.xxxx.ttyy.ui.SettingsFragment.onActivityResult(Unknown Source)
03-17 18:55:37.372 26127 26127 E AndroidRuntime:    at android.app.Activity.dispatchActivityResult(Activity.java:6956)
03-17 18:55:37.372 26127 26127 E AndroidRuntime:    at android.app.ActivityThread.deliverResults(ActivityThread.java:4085)
03-17 18:55:37.372 26127 26127 E AndroidRuntime:    ... 9 more
03-17 18:55:37.377   878  3186 W ActivityManager:   Force finishing activity com.balda.intenttask/.ui.MainActivity

【问题讨论】:

可以添加logcat吗? 您是否尝试改用beginTransaction().replace @cricket_007 我不想替换片段 【参考方案1】:

您可以使用commitAllowingStateLoss

来自文档:

类似于commit(),但允许在活动结束后执行提交 状态被保存。这是危险的,因为如果提交可能会丢失 活动需要稍后从其状态恢复,所以这应该 仅用于 UI 状态可以更改的情况 意外地在用户身上。

尝试使用这个:

getChildFragmentManager().beginTransaction().add(new MyFragment(), TAG).commitAllowingStateLoss();

【讨论】:

取决于...它适用于我的情况...所以我不会只称它为workaround..查看答案Here

以上是关于onActivityResult 中的非法状态异常的主要内容,如果未能解决你的问题,请参考以下文章

使用片段中的处理程序时出现非法状态异常

非法监控状态异常java

JPA 非法状态异常 - CascadeType 问题

mMap.addPolyline 抛出非法状态异常

javaFX Alert抛出无法捕获的非法状态异常?

Crashlytics.logException 方法抛出非法状态异常。无法收集某些活动的非致命问题