跑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()都会抛出异常。
相关推荐
Activity嵌套fragment大全,activity加载单个fragment,TabLayout+ViewPager实现多个fragment滑动效果
这是一个关于从一个activity跳到fragment,再从fragment跳到activity的页面之间的跳转!!!
Fragment获取父Activity的TextView控件并修改内容。这是一个demo,简单实现fragment和activity之间的交互。
Fragment(相同Activity,不同Activity)间的通信,都包含了
Android 笔记-Fragment 与 Activity之间传递数据,使用setArgument方法的例子
在Activity如何改变Fragment的UI,如按返回键改变fragment里面textview的内容
详情见博客:https://blog.csdn.net/qq_20785431/article/details/100519075
其中,fragment与Activity通信就是一个。 fragment与Activity通信主要是两点: 1、fragment传递信息给Activity 此点是通过在fragment中定义接口与Activity共享数据。 2、Activity传递信息给fragment 此点主要是通过...
fragment 与 fragment 通信 fragment 向 activity 传值 activity 向 fragment 传值 代码是自己手敲的
http://blog.csdn.net/RichieZhu/article/details/51024772
demo教你如何实现同一个activity加载不同的fragment 同时实现activity和fragment之间的数据交换 实现在fragment上画图 画二维码 画圆等等
Fragment使用方法的介绍,以及Fragment与Activity之间的通信。
Fragment与Activity之间的数据交换,大体上包括三种: 一、Fragment从Activity获取数据(本文章只介绍第一种); 二、Activity从Fragment获取数据; 三、Fragment之间获取数据。 实现效果: 从Activity传递数据到两...
Fragment和Activity双向交互
Activity与Activity、Activity与Fragment、Fragment与Fragment的数据交互
FragmentActivity源码下载
这里简单介绍了Fragment和Activity使用Handler方式进行交互。
例子主要包括Fragment与Activity之间的通信,代码中还给出了两者之间通信具体调用的函数及其顺序。
Fragment和Activity通信以及Fragment之间通信的方式(二) http://blog.csdn.net/yalinfendou博客中有详细介绍……
fragment之间的切换,fragment和activity之间的切换,