IllegalStateException: Can not perform this action after onSaveInstanceState解决办法

IllegalStateException: Can not perform this action after onSaveInstanceState解决办法

1. 官方描述:

首先我们需要弄清楚onSaveInstanceState方法是在什么时候会被调用,当该Activity即将被销毁前或者按home键退出时调用,来保存Activity数据的,如果在保存玩状态后,桌面通过其他方式启动程序且需要进行Fragment的入栈或弹栈操作就会出错。桌面其他方式如widget、悬浮窗、通知状态栏等方式通过Intent启动程序。此时拦截该Intent可以在下面的方法中进行

    @Override
    protected void onNewIntent(Intent intent) {
        // 拦截Intent,做相应处理
    }
2. 问题的原因:

如果在onNewIntent()这里拦截了Intent进行Fragment的添加和弹栈就会报错:

IllegalStateException: Can not perform this action after onSaveInstanceState

不能在onSaveInstanceState之后立即进行这些操作。

3.解决办法目前找到两种

(1)在onResume执行Fragment的入栈或弹栈操作,即在onNewIntent中保存Intent,在onResume()中进行处理。推荐使用

private Intent onHomeIntent; // home键退出后通过intent启动程序
@Override
protected void onNewIntent(Intent intent) {
    // 拦截Intent,保存Intent,在onResume中进行处理
    onHomeIntent = intent;
}
@Override
public void onResume() {
    if (onHomeIntent != null) {// home键退出后通过intent启动程序
       // dosomething···
       onHomeIntent = null;
    }
    super.onResume();
}


(2)使用Handler.post()将操作添加到UI消息队列中,这个会在主UI线程执行完成后会执行,即执行完了onResume()之后,这样会导致有段时间的延迟,会造成先回复home键退出之前的页面,然后停留几秒钟执行入栈或弹栈操作。体验效果不是很好。因此推荐使用第一种方法,第一种方法会在onResume()进行操作,执行的时机比较好,不会出现延迟。

new Handler().post(new Runnable() {		
@Override
public void run() {
    // do something···
   }
});

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值