java.lang.IllegalStateException Can not perform this action after onSaveInstanceState

今天在bugly意外发现一个非法状态的异常

java.lang.RuntimeException:Unable to destroy activity {com.xxx.xxx/com.xxx.xxx.mvp.orderinfo.ui.OrderInfoActivity}: java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState

他的意思是 这个动作不能在onSaveInstanceState之后进行操作
定位到代码的具体位置是

    @Override
    public void hideProgress() {
        if (progressDialog != null) {
            progressDialog.dismiss();
        }
    }

是上面代码中的progressDialog.dismiss()方法有问题(这是一个DialogFragment)

也就是系统不允许dialog关闭在onSaveInstanceState之后
查了一些资料得到一些信息

java.lang.IllegalStateException异常产生的原因及解决办法

错误类型大致为以下几种:

  • java.lang.IllegalStateException:Cannot forward a response that is already committed
  • IllegalStateException:response already commited
  • IllegalStateException:getOutputStream() has already been called for this request

IllegalStateException: Can not perform this action after onSaveInstanceState:

== 解决办法==:onSaveInstanceState方法是在该Activity即将被销毁前调用,来保存Activity数据的,如果在保存玩状态后
再给它销毁就会出错。解决办法就是把dismiss()方法替换成 dismissAllowingStateLoss()

错误原因:

该异常表示,当前对客户端的响应已经结束,不能在响应已经结束(或说消亡)后再向客户端(实际上是缓冲区)输出任何内容。
Object is no longer valid to operate on. Was it deleted by another thread?
该异常表示,realmObject对象在其他线程已被删除,在这个线程中使用的时候抛出的异常。

补充另一种异常情况:

这里的异常是:
java.lang.IllegalStateException
Can’t change tag of fragment d{e183845 #0 d{e183845}}: was d{e183845} now d{e183845 #0 d{e183845}}
经查,在显示fragment的代码中使用了:
fragment.show(getSupportFragmentManager, fragment.toString());
而这里是因为两次toString()结果不同,导致不同的tag指向的是同一个fragment。
获取fragment的tag的正确方法应该是使用其提供的fragment.getTag()方法。

    原文作者:Yasin27878
    原文地址: https://www.jianshu.com/p/6d483da2be0d
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞