美文网首页
解决IllegalStateException: Can not

解决IllegalStateException: Can not

作者: 海上漂泊的码农 | 来源:发表于2017-02-11 16:16 被阅读0次

解决IllegalStateException: Can not perform this action after

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

此时拦截该Intent可以在下面的方法中进行

@Override

protected void onNewIntent(Intent intent) {

// 拦截Intent,做相应处理

}

如果在这里拦截了Intent进行Fragment的添加和弹栈就会报错:IllegalStateException: Can not perform this action after onSaveInstanceState。不能在onSaveInstanceState之后立即进行这些操作。解决办法目前找到两种

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键退出之前的页面,然后停留几秒钟执行Fragment的入栈或弹栈操作。体验效果不是很好。因此推荐使用第一种方法,第一种方法会在onResume()进行操作,执行的时机比较好,不会出现延迟。

new Handler().post(new Runnable() {

@Override

public void run() {

// do something···

}

});

相关文章

网友评论

      本文标题:解决IllegalStateException: Can not

      本文链接:https://www.haomeiwen.com/subject/rwpgittx.html