跑Monkey的时候经常出来
一、
java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
at android.support.v4.app.FragmentManagerImpl.checkStateLoss(FragmentManager.java:1341)
at android.support.v4.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1352)
at android.support.v4.app.BackStackRecord.commitInternal(BackStackRecord.java:595)
at android.support.v4.app.BackStackRecord.commit(BackStackRecord.java:574)
或者
二、
java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
at android.support.v4.app.FragmentManagerImpl.checkStateLoss(Unknown Source)
at android.support.v4.app.FragmentManagerImpl.popBackStackImmediate(Unknown Source)
at android.support.v4.app.FragmentActivity.onBackPressed(Unknown Source)
原因分析
从异常信息:java.lang.IllegalStateException:Can not perform this action after onSaveInstanceState得出是在onSaveInstanceState之后执行了某种不合法的操作导致.
在onSaveInstanceState之后试图提交FragmentTransaction。为了释放资源,Android系统可以终止非前台Activity所在的进程外的所有应用进程,Activity被回收前系统会回调onSaveInstanceState以保存Activity的状态;在onSaveInstanceState执行之后提交的FragmentTransaction将不会被系统记住,从用户的角度来说FragmentTransaction丢失了,Android为了保证用户体验避免状态的损失,抛出了IllegalStateException。
建议处理方法
1、在Activity的生命周期方法中提交FragmentTransaction须谨慎。
建议在onCreate()或者#onResumeFragments()、onPostResume()中执行,可以保证不会state loss。
至于onResume(),因为此时附属于Activity的Fragment还没到resume状态,意味着之前的状态有可能还保存着,此时不允许FragmentTransaction修改状态(具体可以参考onResume()方法的注释,及Activity.performResume()的代码)。
2、避免异步回调方法里面提交FragmentTransaction。
类似AsyncTask.onPostExecute()或者Handler.handleMessage(),这些方法调用的时候可能Activity.onStop()已被调用,没有一个简单的方法来判断Activity. onSaveInstanceState()是否已被调用(可以考虑自己加个状态变量)。
3、假如不在乎state loss,
使用FragmentTransaction.commitAllowingStateLoss()
吧。
FragmentTransaction.commitAllowingStateLoss()
与
FragmentTransaction.commit()
的区别是前者在发生 state loss的时候不会抛出异常。
4
、对于异常二,因为在onSaveInstanceState()之后执行
onBackPressed()抛出,这个暂时只在monkey中跑出来过,暂时的解决方法是将
onBackPressed()重载,try-catch处理。(如有更好的解决方案,请告知,谢谢)
@Override
public void onBackPressed() {
try {
super.onBackPressed();
} catch (Exception e) {
//一般这里应该把异常信息打印出来
finish();
}
}
另外说些相关的内容:
在Honeycomb(3.0)版本前Activity在onPause()后即可能被杀死,从Honeycomb开始则是在onStop后才可能被杀死。
所有版本在onPause()前FragmentTransaction.commit()都没有问题;Honeycomb(3.0)之前的版本在onPause()与onStop()之间FragmentTransaction.commit()会造成state loss,从Honeycomb开始在onPause()与onStop()之间提交则没有问题;所有版本在onStop()之后FragmentTransaction.commit()都会抛出异常。
相关推荐
在Android应用开发中,Activity和Fragment是两个核心组件。Activity作为应用程序的主要入口点,而Fragment则作为可重用的UI块,可以在多个Activity之间切换或组合。然而,在使用Fragment时,有时会出现一个问题:当...
在Android应用开发中,Fragment和Activity是两个核心组件,它们共同构建了用户界面。Fragment可以理解为Activity的一部分,可以独立存在,也可以嵌入到Activity中,增强了UI的灵活性。本篇将深入探讨Fragment与...
本文将深入探讨如何实现从一个Activity跳转到Fragment,以及如何从Fragment返回到另一个Activity。 首先,我们来看如何从一个Activity启动Fragment。在Android中,Fragment不能直接启动,它必须嵌套在Activity中。...
Fragment允许开发者将UI的不同部分拆分成独立的组件,这些组件可以在不同的Activity之间共享,也可以在同一个Activity内动态地添加、移除或替换。理解Fragment及其与Activity之间的通信对于开发高效且灵活的Android...
在Android应用开发中,Fragment和Activity是两个非常重要的组件,它们负责展示用户界面并处理用户交互。有时,我们可能需要在Fragment和Activity之间进行复杂的通信,例如传递数据或执行异步任务。在这种情况下,...
在Android开发中,Fragment是应用程序界面的一个模块化组件,它可以在Activity中添加、移除或替换。Fragment可以有自己的布局,并且能够与Activity进行交互。在某些场景下,我们需要从Fragment中访问并操作Activity...
在Android开发中,Activity与Fragment是两个核心组件,它们共同构建了用户界面。Fragment可以看作是可重用的UI模块,而Activity则扮演着容器的角色,管理着多个Fragment的生命周期。当我们需要在Activity中改变...
本篇文章将深入探讨如何在Activity中嵌套Fragment,以及如何利用TabLayout和ViewPager来实现多Fragment的滑动效果。 首先,我们来了解Activity加载单个Fragment的基本过程。在Android中,Fragment必须在一个...
在Android应用开发中,Fragment和Activity是两个核心组件,它们共同构建了用户界面。Fragment代表一个可重用的UI部分,而Activity则是程序中的一个窗口,它可以包含一个或多个Fragment。Fragment与Activity之间的...
在Android应用开发中,Fragment是Activity的一个模块化组件,它可以在同一个Activity中或者不同Activity之间进行交互。理解并掌握Fragment间的通信是构建复杂用户界面的关键。以下将详细讲解Fragment(相同Activity...
Android提供了一种名为"Transactions"的方法来管理Fragment的生命周期和动画效果。我们可以使用`FragmentManager.beginTransaction()`方法创建一个事务,并通过`setCustomAnimation()`方法设置自定义的进入和退出...
在Android应用开发中,Fragment和Activity是构成用户界面的基本组件。Fragment可以理解为一个可重用的UI模块,而Activity则是承载这些模块的容器。两者之间的通信以及Fragment之间的通信是Android开发中的重要知识点...
"Two Fragment use one Activity"这个主题,主要讲解如何在Android 4.0(API级别14)及以上版本中,将两个Fragment整合到同一个Activity中进行管理。下面我们将详细探讨Fragment的基本概念、生命周期、与Activity的...
在Android应用开发中,Fragment和Activity是两个核心组件,它们之间的交互构成了用户界面的主要部分。Fragment代表一个可重用的UI模块,而Activity则作为应用程序的窗口或上下文。了解如何有效地让Fragment与...
在Android应用开发中,Fragment和Activity是两个核心组件,它们之间的有效交互对于构建复杂的用户界面至关重要。Fragment可以看作是Activity的一部分,具有自己的生命周期,并可以在Activity中动态添加、移除或替换...
fragment 与 fragment 通信 fragment 向 activity 传值 activity 向 fragment 传值 代码是自己手敲的
http://blog.csdn.net/RichieZhu/article/details/51024772
在Android应用开发中,Fragment和Activity是两个核心组件,它们共同构建了用户界面。Fragment代表一个可重用的UI部分,而Activity则是程序中的一个窗口,它可以包含一个或多个Fragment。有时,我们需要在Fragment和...
Fragment与Activity之间的数据交换,大体上包括三种: 一、Fragment从Activity获取数据(本文章只介绍第一种); 二、Activity从Fragment获取数据; 三、Fragment之间获取数据。 实现效果: 从Activity传递数据到两...
### FragmentActivity源码解析 #### 一、简介 在Android开发过程中,`FragmentActivity`是支持库中的一个关键类,它允许开发者在较旧版本的Android系统上使用Fragment API。此文档将对`FragmentActivity`的源代码...