java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
在使用Fragment的过程中,常常会遇到在Activity的onSaveInstanceState方法调用之后,操作commit或者popBackStack而导致的crash.
因为在onSaveInstanceState方法之后的操作状态可能会丢失,因此Android framework默认会抛出一个异常.
对于commit方法来说,单纯避免这个异常很简单,使用commitAllowingStateLoss方法即可.但是popBackStack以及 popBackStackImmediate也都会检查state(checkStateLoss),特别需要注意的是Activity的 onBackPressed方法
onBackPressed的调用时机:
* targetSdkVersion <= 5,在onKeyDown中调用
* targetSdkVersion > 5,在onKeyUp中调用
onSavedInstanceState的调用时机(如果调用的话):
* 一定在onStop之前
* 可能在onPause之前,也可能在onPause与onStop之间
需要注意的是: onSavedInstanceState方法不一定会调用,只有在Activity因为某些原因而被Framework销毁,并且之后还需要重新创建的情况,才需要调用(例如:旋屏,或者内存不足而回收返回栈中的某些Activity)
举例:
* Activity A在前台时,屏幕逐渐变暗直至锁屏,那么A的onSavedInstanceState会被调用
* Activity A start Activity B,Activity A的onSavedInstanceState会被调用
* Activity A因为返回键或者finish调用而返回到上一个界面,那么A的onSavedInstanceState不会被调用
因此,当onBackPressed在onSavedInstanceState方法之后调用,就一定会crash.解决方法主要有两种:
重写Activity的onSavedInstanceState()方法,并且注释掉super调用.
这种方法能避免crash,但是它会导致整个Activity的状态丢失.以DialogFragment为例,正常情况下,显示的 DialogFragment在旋屏Activity重新创建之后,不需要我们处理,Dialog会自动显示出来(参见 DialogFragment.onStart()),但是注释掉Activity的onSavedInstanceState()方法之 后,Fragment状态丢失,Activity重新创建之后,Dialog也就不会再显示出来了.
更好且通用的做法:在调用commit,popBackStack以及onBackPressed方法之前,判断 onSavedInstanceState()方法是否已经执行,并且onResume方法还没有执行,如果不是,那么直接操作,否则加入到 pending队列,等待onResumeFragments或者onPostResume之后再执行.
注意:不要在onResume中操作,因为这时候FragmentManager中的mStateSaved依然可能是true.(如果执行顺序是 onSavedInstanceState()->onPause()->onResume() 或者 onPause()->onSavedInstanceState()->onResume());
public void endPaintingPager(int index) {if (mFirstLevel == PAINTING_PAGER) {mFirstLevel = PAINTER_START;if (!mIsStateSaved) {getSupportFragmentManager().popBackStack();} else {mPopBackStackRunnable = new Runnable() {@Overridepublic void run() {getSupportFragmentManager().popBackStack();}};}}}
@Overrideprotected void onPostResume() {super.onPostResume();if (mPopBackStackRunnable != null) {mPopBackStackRunnable.run();}}
转载于:https://www.cnblogs.com/reverie/p/5524124.html
java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState相关推荐
- Caused by:Java.lang.IllegalStateException:Can not perform this action after onSaveInStanceState
出现情况: 是在使用FragmentTransition 的 Commit() 方法添加一个 Fragment的时候出现的. 问题原因: onSaveInstanceState()方法是在该Acti ...
- 解决IllegalStateException: Can not perform this action after onSaveInstanceState
错误信息: java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState at andr ...
- Android之提示错误Can not perform this action after onSaveInstanceState
1 问题 主页面3个Fragment,在第三个Fragment里面开启了Activity之后,然后想跳到第一个Fragment代码如下 /*** 展示Fragment*/private fun sho ...
- Fragment Or DialogFragment Can not perform this action after onSaveInstanceState
转载自Fragment Or DialogFragment Can not perform this action after onSaveInstanceState 表现 可会造成app崩溃掉,具体 ...
- java ajax点击出现_jquery ajax获取json数据 然后action 的response 返回数据出现 java.lang.IllegalStateException异常...
程序运行出现这样的异常: 严重: Servlet.service() for servlet default threw exception java.lang.IllegalStateExcepti ...
- 批量下载的实现及java.lang.IllegalStateException异常
在工作流的一张表单里可能会有多个步骤上传附件,在用户的待办中往往会存在多条带有附件的任务,如果一一打开并且点击下载链接下载,不仅费时,而且繁琐,用户体验较差. OA系统采用的是FastDFS做为文件服 ...
- IDEA热布署报错java.lang.IllegalStateException: Restarter has not been initialized
在IDEA导入devtools依赖实现热布署,启动后遇到如下问题 java.lang.IllegalStateException: Restarter has not been initialized ...
- java.lang.IllegalStateException: Calling [asyncError()] is not valid for a request with Async state
1.这个问题是在搭建spring-admin监控的时候发现的, 版本如下 spring-boot: 2.1.7.RELEASE spring-boot-admin:2.1.5 问题的相关描述看这里 h ...
- springboot配置log4j2报错:java.lang.IllegalStateException: Logback configuration error detected:
引入log4j2后启动报错. Exception in thread "main" java.lang.IllegalStateException: java.lang.Illeg ...
最新文章
- python不能加密吗_为什么我不能解密我用pycrypto加密的内容?
- 雷军大秀新宠「铁蛋」!打滚握手会空翻,这个机器狗只要9999
- SAP MM 移动类型-入门篇
- Ubuntu下安装arm-linux-gcc-4.4.3.tar.gz (交叉编译环境)
- 禁止更改计算机名_【复习收藏】计算机操作系统考点归纳
- .NET Framework4.5下载地址和安装
- cli2弃用了吗 vue_vue cli - 2 升级到 3的问题汇总
- 骨传导技术:帮你摆脱噪音的困扰
- 算法学习 -- 枚举
- 高三!忏悔ing~(在这儿的第一篇随笔)
- pythondraw解释_科学网—Draw figures with Python - 高琳琳的博文
- mysql表名命名规范_数据库表名的命名规范
- 基于JAVA学生用品交换平台计算机毕业设计源码+系统+数据库+lw文档+部署
- 麒麟座V3.1接入OneNET平台初体验--上传温湿度
- 《PUBG》大动作封锁3百万玩家 作弊问题严重
- 【文献翻译】基于SCAP的配置分析用于全面的合规性检查
- 亚马逊echo中国使用_我需要Amazon Echo才能使用Alexa吗?
- UDF开发手册 - UDF
- top和margin-top的区别
- java 时间轮算法_时间轮算法解析(Netty HashedWheelTimer源码解读)
热门文章
- 计算机网络第一二三章计算题,计算机网络第3章习题及答案
- 二进制求和Python解法
- oracle rollup 小计,Oracle Group By 用法之 —— Rollup (小计功能)
- python中等高线填充颜色_Python matplotlib等高线图对数颜色
- 用python编21点游戏_【Python3】21点游戏
- reactinput聚焦事件_React focus 事件的坑
- linux 超时 tcp,Linux中TCP设置syn超时时间
- php 正规标题,一些PHP面试标题
- php板块模板,有没有办法制作模板,但没有在板块php渲染它
- 小米无法链接华硕路由器_2000元的华硕电竞路由器开箱,如此高贵,体验是怎样的?...