首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

在fragmentTransaction.commit()上出现"java.lang.IllegalStateException:在onSaveInstanceState之后无法执行此操作“

在Android开发中,FragmentTransaction.commit()方法用于提交对Fragment事务的更改。然而,如果在onSaveInstanceState()之后调用commit()方法,就会抛出java.lang.IllegalStateException异常,提示“在onSaveInstanceState之后无法执行此操作”。

这是因为在onSaveInstanceState()方法调用之后,Activity的状态已经被保存,系统可能会在不久的将来销毁并重建Activity。在这种情况下,执行Fragment事务可能会导致状态不一致或其他问题。

以下是一些解决这个问题的常见方法:

1. 检查Activity的状态

在调用commit()方法之前,检查Activity是否处于可以执行Fragment事务的状态。例如,可以使用isFinishing()isDestroyed()方法来检查Activity的状态。

代码语言:javascript
复制
if (!getActivity().isFinishing() && !getActivity().isDestroyed()) {
    FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
    // 添加、替换或移除Fragment
    fragmentTransaction.commit();
}

2. 使用commitAllowingStateLoss()

如果你确定在onSaveInstanceState()之后执行Fragment事务不会导致状态丢失或其他问题,可以使用commitAllowingStateLoss()方法。这个方法允许在Activity状态已经保存的情况下执行Fragment事务,但会忽略状态丢失的警告。

代码语言:javascript
复制
FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
// 添加、替换或移除Fragment
fragmentTransaction.commitAllowingStateLoss();

3. 延迟执行

如果可能的话,延迟执行Fragment事务,直到Activity处于安全的状态。例如,可以在onResume()方法中执行Fragment事务。

代码语言:javascript
复制
@Override
public void onResume() {
    super.onResume();
    if (!getActivity().isFinishing() && !getActivity().isDestroyed()) {
        FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
        // 添加、替换或移除Fragment
        fragmentTransaction.commit();
    }
}

4. 使用Handler延迟执行

如果需要在某个特定事件之后执行Fragment事务,可以使用Handler来延迟执行。

代码语言:javascript
复制
new Handler(Looper.getMainLooper()).post(new Runnable() {
    @Override
    public void run() {
        if (!getActivity().isFinishing() && !getActivity().isDestroyed()) {
            FragmentTransaction fragmentTransaction = getSupportFragmentManager().beginTransaction();
            // 添加、替换或移除Fragment
            fragmentTransaction.commit();
        }
    }
});

总结

onSaveInstanceState()之后调用commit()方法会导致java.lang.IllegalStateException异常。为了避免这个问题,可以检查Activity的状态、使用commitAllowingStateLoss()方法、延迟执行或使用Handler延迟执行Fragment事务。选择哪种方法取决于你的具体需求和应用场景。

相关搜索:在onSaveInstanceState之后无法执行此操作嵌套片段:在onSaveInstanceState之后无法执行此操作java.lang.IllegalStateException:在由launchFragmentInContainer引起的onSaveInstanceState之后无法执行此操作登录,然后在ViewPager中登录-在onSaveInstanceState之后无法执行此操作由: java.lang.IllegalStateException:替换activity中的任何片段时,在onSaveInstanceState之后无法执行此操作无法在android webview上执行操作无法在BuildFire数据存储区上执行searchAndUpdate操作错误:无法在节点'rabbit@localhost‘上执行操作Java应用程序仅允许在even thread错误上执行此操作构建“无法在节点上执行操作”时Docker rabbitmq镜像错误无法在selenium C#中的切换按钮上执行单击操作“无法更新终结点默认值/myservice:无法在终结点”myservice“上执行操作:无法在Table上执行创建,更新或删除操作,因为它没有主键寻找允许我在第二次出现"/“之后执行所有操作的正则表达式在React Native上获得此位置后,我如何检测用户何时获得视图并执行某些操作?SSMS错误:无法继续在目标实例上执行DAC操作,因为它不支持DAC在OpenShift上运行Docker镜像时出现“无此文件或目录”错误,但在执行"docker run“时不会出现此错误。Proguard插件出现错误:无法在项目X上执行goal: proguard (默认):混淆失败(result=1)iPhone应用程序在iPads上运行不好,出于某种原因,在应用程序审核过程中需要执行此操作?React警告:无法在卸载的组件上执行React状态更新。要修复此问题,请取消所有订阅
相关搜索:
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Android 进阶解密笔记-插件化

此时Activity已经可见了,但是还没出现在前台,我们还看不到,无法与Activity交互。...onSaveInstanceState和onRestoreInstanceState 两者执行时间 当targetSdkVersion小于3时onSaveInstanceStateonPause方法中调用的...而onRestoreInstanceState是onStart之后、onResume之前调用的** onSaveInstanceState调用 Activity被覆盖或退居后台之后,系统资源不足将其杀死...onRestoreInstanceState调用 Activity被覆盖或退居后台之后,系统资源不足将其杀死,然后用户又回到了Activity,方法会被调用; 在用户改变屏幕方向时,重建的过程中,...我们可以重写方法,以便可以恢复一些临时数据。 onRestoreInstanceState的调用顺序是onStart之后;

82310
  • 安卓activity生命周期_请描述activity的生命周期

    onCreate:首次创建 Activity 时调用。系统向方法传递一个 Bundle 对象,其中包含 Activity 的一状态,不过前提是捕获了该状态,而后会调用onStart方法。...它应该非常迅速地执行所需操作,因为它返回后,下一个 Activity 才能继续执行,所以不能执行耗时操作。而后正常情况下会调用onStop方法。...1.onSaveInstanceState:当系统为了恢复内存而销毁某项 Activity 时,Activity 对象也会被销毁,因此系统继续 Activity 时根本无法让其状态保持完好,而是必须在用户返回...--> test 总结:注意:onSaveInstanceState的调用时序onStop之前,但是和onPause 的调用时序就不一定了,有可能在onPause之前或者之后。...又因为无法保证系统会调用onSaveInstanceState(存在不需要保存状态的情况,例如用户使用“返回”按钮离开您的 Activity 时,因为用户的行为是显式关闭 Activity),因此您只应利用它来记录

    56310

    Carson带你学Android:这是一份详细 & 全面的Fragment学习攻略

    方法 为Fragment创建视图(加载布局)时调用(给当前的fragment绘制UI布局,可以使用线程更新UI) onActivityCreated方法 当Activity中的onCreate方法执行完后调用...(表示activity执行oncreate方法完成了的时候会调用方法) onDestroyView方法 Fragment中的布局被移除时调用(表示fragment销毁相关联的UI布局) onDetach...onCreate() onCreateView() onActivityCreated() 其他场景的调用 屏幕灭掉 onPause() onSaveInstanceState() onStop...onDestroyView() 切换回本身的Fragment onCreateView() onActivityCreated() onStart() onResume() 回到桌面 onPause() onSaveInstanceState...布局文件中定义的占位符中(FrameLayout) fragmentTransaction.add(R.id.about_fragment_container, fragment); fragmentTransaction.commit

    37020

    activity生命周期有几种状态_activity生命周期七种方法

    poused->依旧在用户可见状态,但是界面焦点已经失去,Activity无法与用户进行交互。...Paused ——>Running所执行的生命周期为:OnResume() 当前重新回到活动状态(Running),此情况用户操作home键,然后重新回到当前activity界面发生。...(Bundle outState): onSaveInstanceState函数Activity生命周期中执行。...但是不确定是 onPause() 方法之前 还是 之后调用; 布局中组件状态存储 : 每个组件都 实现了 onSaveInstance() 方法, 调用函数的时候, 会自动保存组件的状态, 注意...(Bundle outState): 方法回调时机 : Activity 被系统销毁之后 恢复 Activity 时被调用, 只有销毁了之后重建的时候才调用, 如果内存充足, 系统没有销毁这个 Activity

    1.2K10

    Android基础 | 关于Activity你应该明白的一切

    假设当前 Activity为A,如果这时用户打开一个新的Activity B,那么B的onResume和A的onPuase那个先执行? A的 onPause 先执行。...Android的官方文档中,旧的Activity onPause执行之后,新的Activity 才能onResume,所以我们应该尽量避免 onPause 中做太多耗时操作,尽量应该放到onStop...异常情况下的生命周期与处理方式 我们开发中,经常会遇到转屏的问题,而转屏一般也会带来 Activity的重新创建,所以大多数开发者开发的时候,Activity默认是禁止转屏的,但是一些短视频软件,...这个方法的调用时机是 onStop 之前,它和onPause 没有既定的时序关系,有可能在onPause之前调用,也有可能在 onPause之后调用。...onStart之后

    74220

    onSaveInstanceState和onRestoreInstanceState详解

    屏幕切换之前,系统会销毁activity A,屏幕切换之后系统又会自动地创建activity A,所以onSaveInstanceState()一定会被执行,且也一定会执行onRestoreInstanceState...也说明二者,大多数情况下不成对被使用。...四. onSaveInstanceState()方法的默认实现    如果我们没有覆写onSaveInstanceState()方法, 方法的默认实现会自动保存activity中的某些状态数据, 比如...由所述, 如果我们需要覆写onSaveInstanceState()方法, 一般会在第一行代码中调用该方法的默认实现:super.onSaveInstanceState(outState)。 五....由于onSaveInstanceState()方法方法不一定会被调用, 因此不适合在该方法中保存持久化数据, 例如向数据库中插入记录等. 保存持久化数据的操作应该放在onPause()中。

    2.2K50

    Fragment新功能,setMaxLifecycle了解一下

    Fragment代码淘汰了setUserVisibleHint方法,转而支持用setMaxLifecycle方法,setMaxLifecycle言外之意是设置最大生命周期,懂行的人应该知道,Fragment一直都是无法直接设置生命周期...中,定义了五种State,这里的State并非上面说Lifecycle.State,但是逻辑基本是一致的; INITIALIZING 初始状态 CREATED 已创建状态 ACTIVITY_CREATED...add命令的状态变化: 单独执行add操作 FragmentTransaction fragmentTransaction = supportFragmentManager.beginTransaction...对RESUMED状态的Fragment进行操作STARTED操作 ? 对RESUMED状态的Fragment进行操作CREATED操作进行STARTED操作 ?...因为这里本质用的是add+Lifecycle.State.STARTED和attach+Lifecycle.State.STARTED组合; 最终的结果是不可见的Fragment只会走到生命周期onStart

    2.7K40

    Activity 的 36 大难点,你会几个?「建议收藏」

    由于当一个 Activity 设置了 SingleTop 或者 SingleTask 模式后,跳转 Activity 出现复用原有 Activity 的情况时, Activity 的 onCreate...而一般 onCreate 方法中会进行该页面的数据初始化、UI 初始化,假设页面的展示数据无关页面跳转传递的參数,则不必操心问题 若页面展示的数据就是通过 getInten() 方法来获取,那么问题就会出现...2.4 快速启动一个 Activity 这个问题其实也是比较简单的,就是不要在 Activity 的 onCreate 方法中执行过多繁重的操作,并且 onPasue 方法中同样不能做过多的耗时操作...举例来说,这可能发生在,如果一个前台活动一个对话框(其他进程的)运行之后仍然是可视的,比如输入法的弹出时。 寄宿着一个服务,该服务绑定到一个可视的活动。...如果耗时操作需要让用户等待,那么可以界面上显示进度条。

    75820

    Android查缺补漏--Activity生命周期和启动模式

    onStart():首次启动Activity时onCreate()之后被回调,再次启动时onRestart()之后被回调。此时Activity已经可见但还没出现到前台不能与用户交互。...onResume():onStart()之后被回调,此时Activity已经完全可见并且可以与用户交互。...横竖屏切换时Activity会先被销毁,然后再重新创建,销毁时onPause()被调用之后会调用onSaveInstanceState(Bundle bundle),此时我们就有机会将一些需要恢复的信息写入...onSaveInstanceState()的Bundle参数中,Activity被重建时,调用onStart()之后会调用onRestoreInstanceState(Bundle bundle),此时我们就可以...3、系统内存不足导致低优先级的Activity被回收时的生命周期方法执行顺序 此种情况和第二种横竖屏切换时的情况查不多,也会执行onSaveInstanceState()和onRestoreInstanceState

    58400

    Activity的生命周期

    比如用户按HOME键切换到桌面或者用户打开了一个新的Activity这时当前的Activity就会暂停 也就是onPause和onStop被执行了接着用户又回到这个Activity就会出现这种情况...(3)onStart() 表示Activity正在被启动 即将开始 这是Activity已经可见 但还没出现在前台 还无法与用户交互 (4)onResume 表示Activity已经可见了 并出现在前台并已经开始活动...onStop onDestroy均会被调用 用于Activity被异常终止的 系统会调用onSaveInstanceState保存当前Activity状态 重新创建后系统会调用onRestoreInstanceState...并把Activity销毁时onSaveInstanceState方法保存的Bundle对象作为参数同时传递给onRestoreInstanceState和onCreate onSaveInstanceState...onStop之前调用 和onPause没有时序的关系 onRestoreInstanceStateonStart之后调用 情况2资源内存不足导致低优先级的Activity被杀死 数据存储和恢复过程和情况

    31320

    Activity详细解释(生命周期、以各种方式启动Activity、状态保存,等完全退出)

    简单的说:Activity或者悬浮于其它窗体的交互界面。 一个应用程序中通常由多个Activity构成。...OK,启动之后按下Home键。回到Launcher。查看信息打印:onPause—onStop。再次打开的执行过程:onRestart—onStart—onResume。...不管该方法里面进行不论什么操作。都须要较高速完毕,由于假设它不返回的话,下一个 activity 将无法恢复出来。...所以并不能保证会调用onSaveInstanceState。假设调用了该方法。通常是onStop 方法之前且可能在 onPause 之后调用。...程序退出了,可是我们查看其进程,发现调用了onDestroy方法之后这个Activity还在执行。 甚至调用了finish()方法之后程序还能在进程中看到。

    1K20

    从0系统学Android--4.2 Fragment 生命周期

    4.3.2 体验碎片的生命周期 就是在上一个例子的基础每个方法汇总打印一下,观察一下效果就好了。...效果: 碎片中,你也是可以通过 onSaveInstanceState() 方法来保存数据,因为进入停止状态的碎片也是有可能被系统在内存不足的情况下收回的。...4.4.1 使用限定符 经常使用平板电脑我们会发现有些应用都是采用双页模式(程序会在左侧面板显示一个包含子项的列表,右侧的面板显示内容)。这是因为平板电脑屏幕的大的原因,完全可以显示两页的内容。...平板电脑效果是双页模式:效果如 试想我们是不是可以为手机和平板每个端提供一个应用程序呢?如果这样做的话会浪费很多的人力物力,因为这样意味着要同时维护两份代码。...Fragment 的出现就是为了充分利用屏幕空间的。这里可以使用 Fragment 来很多的处理这个问题。 思路:通过限定符,在手机上面会加载直接标题列表的页面,平板上会加载列表和内容页面。

    58510

    Android基础_1 四大基本组件介绍与生命周期

    一般来说是状态栏放一个持久的图标,用户可以打开它并获取消 息。...当连接到一个service 之后,我们还可以service 提供的接口与它进行通讯。拿媒体播放器这个例子来说,我们还可以进行暂停、重播等操作。...而当用户按下BACK 键的时候,你的activity 又会再一次的显示屏幕,此时任务是由2个应用程序中的相关activity组成的)栈底的是启动整个任务的Activity,栈顶的是当前运行的用户可以交互的...Android系统是一个多任务(Multi-Task)的操作系统,可以在用手机听音乐的同时,也执行其他多个程序。...此时用到了onSaveInstanceState(),方法onSaveInstanceState()用来保存Activity被杀之前的状态,onPause()之前被触发,当系统为了节省内存销毁了Activity

    1.5K30

    Activity16问

    搞懂这个生命周期的执行后就可以回答了,首先要知道面试官的意思:是要重新启动并恢复这个 Activity 还是说直接退出整个 app 如果要恢复则要在 onSaveInstanceState() 中进行保存数据并在...Activity的新实例,则系统会调用原有实例的onNewIntent()方法来处理intent....6.启动模式的实际应用场景 7.快速启动一个 Activity 这个问题其实也是比较简单的,就是不要在 Activity 的 onCreate 方法中执行过多繁重的操作,并且 onPasue...Activity 的 Flags 8.内存不足时系统会杀掉后台的Activity,若需要进行一些临时状态的保存,在哪个方法进行 9.onSaveInstanceState() 被执行的场景...举一个生活中的场景: 1.某外卖 App 中下好订单后,跳转到支付宝进行支付。当在支付宝中支付成功之后,页面停留在支付宝支付成功页面。

    37510
    领券