`
椰子面包
  • 浏览: 7347 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

FragmentTransactions 及 Activity State Loss

 
阅读更多

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(),因为此时附属于ActivityFragment还没到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)版本前ActivityonPause()后即可能被杀死,从Honeycomb开始则是在onStop后才可能被杀死。

 

所有版本在onPause()FragmentTransaction.commit()都没有问题;Honeycomb(3.0)之前的版本在onPause()onStop()之间FragmentTransaction.commit()会造成state lossHoneycomb开始在onPause()onStop()之间提交则没有问题;所有版本在onStop()之后FragmentTransaction.commit()都会抛出异常。

分享到:
评论

相关推荐

    Android Activity内嵌Fragment,当Activity recreate时Fragment被添加多次,造成界面重叠

    在Android应用开发中,Activity和Fragment是两个核心组件。Activity作为应用程序的主要入口点,而Fragment则作为可重用的UI块,可以在多个Activity之间切换或组合。然而,在使用Fragment时,有时会出现一个问题:当...

    Fragment 与 Activity之间传递数据

    在Android应用开发中,Fragment和Activity是两个核心组件,它们共同构建了用户界面。Fragment可以理解为Activity的一部分,可以独立存在,也可以嵌入到Activity中,增强了UI的灵活性。本篇将深入探讨Fragment与...

    从一个activity跳到fragment,再从fragment跳到activity

    本文将深入探讨如何实现从一个Activity跳转到Fragment,以及如何从Fragment返回到另一个Activity。 首先,我们来看如何从一个Activity启动Fragment。在Android中,Fragment不能直接启动,它必须嵌套在Activity中。...

    Fragment的介绍,以及Fragment与Activity之间的通信

    Fragment允许开发者将UI的不同部分拆分成独立的组件,这些组件可以在不同的Activity之间共享,也可以在同一个Activity内动态地添加、移除或替换。理解Fragment及其与Activity之间的通信对于开发高效且灵活的Android...

    Fragment与Activity使用Handler进行交互

    在Android应用开发中,Fragment和Activity是两个非常重要的组件,它们负责展示用户界面并处理用户交互。有时,我们可能需要在Fragment和Activity之间进行复杂的通信,例如传递数据或执行异步任务。在这种情况下,...

    Fragment获取父Activity的TextView控件并修改内容

    在Android开发中,Fragment是应用程序界面的一个模块化组件,它可以在Activity中添加、移除或替换。Fragment可以有自己的布局,并且能够与Activity进行交互。在某些场景下,我们需要从Fragment中访问并操作Activity...

    Activity如何改变Fragment的UI

    在Android开发中,Activity与Fragment是两个核心组件,它们共同构建了用户界面。Fragment可以看作是可重用的UI模块,而Activity则扮演着容器的角色,管理着多个Fragment的生命周期。当我们需要在Activity中改变...

    Activity嵌套fragment大全,activity加载单个fragment,TabLayout+ViewPager实现多个fragment滑动效果

    本篇文章将深入探讨如何在Activity中嵌套Fragment,以及如何利用TabLayout和ViewPager来实现多Fragment的滑动效果。 首先,我们来了解Activity加载单个Fragment的基本过程。在Android中,Fragment必须在一个...

    Fragment与Activity之间通信实例

    在Android应用开发中,Fragment和Activity是两个核心组件,它们共同构建了用户界面。Fragment代表一个可重用的UI部分,而Activity则是程序中的一个窗口,它可以包含一个或多个Fragment。Fragment与Activity之间的...

    Fragment(相同Activity,不同Activity)间的通信

    在Android应用开发中,Fragment是Activity的一个模块化组件,它可以在同一个Activity中或者不同Activity之间进行交互。理解并掌握Fragment间的通信是构建复杂用户界面的关键。以下将详细讲解Fragment(相同Activity...

    Fragment,Activity切换动画demo

    Android提供了一种名为"Transactions"的方法来管理Fragment的生命周期和动画效果。我们可以使用`FragmentManager.beginTransaction()`方法创建一个事务,并通过`setCustomAnimation()`方法设置自定义的进入和退出...

    Fragment和Activity通信以及Fragment之间通信的方式(二)

    在Android应用开发中,Fragment和Activity是构成用户界面的基本组件。Fragment可以理解为一个可重用的UI模块,而Activity则是承载这些模块的容器。两者之间的通信以及Fragment之间的通信是Android开发中的重要知识点...

    Two Fragment use one Activity

    "Two Fragment use one Activity"这个主题,主要讲解如何在Android 4.0(API级别14)及以上版本中,将两个Fragment整合到同一个Activity中进行管理。下面我们将详细探讨Fragment的基本概念、生命周期、与Activity的...

    Fragment和Activity交互

    在Android应用开发中,Fragment和Activity是两个核心组件,它们之间的交互构成了用户界面的主要部分。Fragment代表一个可重用的UI模块,而Activity则作为应用程序的窗口或上下文。了解如何有效地让Fragment与...

    Fragment和Activity双向交互

    在Android应用开发中,Fragment和Activity是两个核心组件,它们之间的有效交互对于构建复杂的用户界面至关重要。Fragment可以看作是Activity的一部分,具有自己的生命周期,并可以在Activity中动态添加、移除或替换...

    fragment 与 activity 通信, fragment 与fragment通信

    fragment 与 fragment 通信 fragment 向 activity 传值 activity 向 fragment 传值 代码是自己手敲的

    Fragment之间通过Activity相互传值和调用方法

    http://blog.csdn.net/RichieZhu/article/details/51024772

    Fragment和Activity交互(Handler方式)

    在Android应用开发中,Fragment和Activity是两个核心组件,它们共同构建了用户界面。Fragment代表一个可重用的UI部分,而Activity则是程序中的一个窗口,它可以包含一个或多个Fragment。有时,我们需要在Fragment和...

    Android Fragment与Activity之间的数据交换(Fragment从Activity获取数据)

    Fragment与Activity之间的数据交换,大体上包括三种: 一、Fragment从Activity获取数据(本文章只介绍第一种); 二、Activity从Fragment获取数据; 三、Fragment之间获取数据。 实现效果: 从Activity传递数据到两...

    FragmentActivity源码下载

    ### FragmentActivity源码解析 #### 一、简介 在Android开发过程中,`FragmentActivity`是支持库中的一个关键类,它允许开发者在较旧版本的Android系统上使用Fragment API。此文档将对`FragmentActivity`的源代码...

Global site tag (gtag.js) - Google Analytics