在使用Fragment的过程中,常常会遇到在Activity的onSaveInstanceState方法调用之后,操作commit或者popBackStack而导致的crash.
因为在onSaveInstanceState方法之后的操作状态可能会丢失,因此Android framework默认会抛出一个异常.
对于commit方法来说,单纯避免这个异常很简单,使用commitAllowingStateLoss方法即可.但是popBackStack以及 popBackStackImmediate也都会检查state(checkStateLoss),特别需要注意的是Activity的 onBackPressed方法

如果onBackPressed在onSavedInstanceState之后调用,那么就会crash.

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相关推荐

  1. Caused by:Java.lang.IllegalStateException:Can not perform this action after onSaveInStanceState

    出现情况: 是在使用FragmentTransition 的  Commit() 方法添加一个 Fragment的时候出现的. 问题原因: onSaveInstanceState()方法是在该Acti ...

  2. 解决IllegalStateException: Can not perform this action after onSaveInstanceState

    错误信息: java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState at andr ...

  3. Android之提示错误Can not perform this action after onSaveInstanceState

    1 问题 主页面3个Fragment,在第三个Fragment里面开启了Activity之后,然后想跳到第一个Fragment代码如下 /*** 展示Fragment*/private fun sho ...

  4. Fragment Or DialogFragment Can not perform this action after onSaveInstanceState

    转载自Fragment Or DialogFragment Can not perform this action after onSaveInstanceState 表现 可会造成app崩溃掉,具体 ...

  5. java ajax点击出现_jquery ajax获取json数据 然后action 的response 返回数据出现 java.lang.IllegalStateException异常...

    程序运行出现这样的异常: 严重: Servlet.service() for servlet default threw exception java.lang.IllegalStateExcepti ...

  6. 批量下载的实现及java.lang.IllegalStateException异常

    在工作流的一张表单里可能会有多个步骤上传附件,在用户的待办中往往会存在多条带有附件的任务,如果一一打开并且点击下载链接下载,不仅费时,而且繁琐,用户体验较差. OA系统采用的是FastDFS做为文件服 ...

  7. IDEA热布署报错java.lang.IllegalStateException: Restarter has not been initialized

    在IDEA导入devtools依赖实现热布署,启动后遇到如下问题 java.lang.IllegalStateException: Restarter has not been initialized ...

  8. 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 ...

  9. springboot配置log4j2报错:java.lang.IllegalStateException: Logback configuration error detected:

    引入log4j2后启动报错. Exception in thread "main" java.lang.IllegalStateException: java.lang.Illeg ...

最新文章

  1. python不能加密吗_为什么我不能解密我用pycrypto加密的内容?
  2. 雷军大秀新宠「铁蛋」!打滚握手会空翻,这个机器狗只要9999
  3. SAP MM 移动类型-入门篇
  4. Ubuntu下安装arm-linux-gcc-4.4.3.tar.gz (交叉编译环境)
  5. 禁止更改计算机名_【复习收藏】计算机操作系统考点归纳
  6. .NET Framework4.5下载地址和安装
  7. cli2弃用了吗 vue_vue cli - 2 升级到 3的问题汇总
  8. 骨传导技术:帮你摆脱噪音的困扰
  9. 算法学习 -- 枚举
  10. 高三!忏悔ing~(在这儿的第一篇随笔)
  11. pythondraw解释_科学网—Draw figures with Python - 高琳琳的博文
  12. mysql表名命名规范_数据库表名的命名规范
  13. 基于JAVA学生用品交换平台计算机毕业设计源码+系统+数据库+lw文档+部署
  14. 麒麟座V3.1接入OneNET平台初体验--上传温湿度
  15. 《PUBG》大动作封锁3百万玩家 作弊问题严重
  16. 【文献翻译】基于SCAP的配置分析用于全面的合规性检查
  17. 亚马逊echo中国使用_我需要Amazon Echo才能使用Alexa吗?
  18. UDF开发手册 - UDF
  19. top和margin-top的区别
  20. java 时间轮算法_时间轮算法解析(Netty HashedWheelTimer源码解读)

热门文章

  1. 计算机网络第一二三章计算题,计算机网络第3章习题及答案
  2. 二进制求和Python解法
  3. oracle rollup 小计,Oracle Group By 用法之 —— Rollup (小计功能)
  4. python中等高线填充颜色_Python matplotlib等高线图对数颜色
  5. 用python编21点游戏_【Python3】21点游戏
  6. reactinput聚焦事件_React focus 事件的坑
  7. linux 超时 tcp,Linux中TCP设置syn超时时间
  8. php 正规标题,一些PHP面试标题
  9. php板块模板,有没有办法制作模板,但没有在板块php渲染它
  10. 小米无法链接华硕路由器_2000元的华硕电竞路由器开箱,如此高贵,体验是怎样的?...