今天在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()方法。