FragmentTransaction的commit和commitAllowingStateLoss的区别

数学建模灵敏性分析(一阶、二阶灵敏度)python代码+懒人专用版 对于勉强看懂了灵敏度分析的同学来说,本文给出一个方便移植、修改的python程序,可以很方便地进行灵敏度分析。 阅读详情

1、什么是FragmentTransaction?

使用Fragment时,可以通过用户交互来执行一些动作,比如增加、移除、替换等。

所有这些改变构成一个集合,这个集合被叫做一个transaction。

可以调用FragmentTransaction中的方法来处理这个transaction,并且可以将transaction存进由activity管理的back stack中,这样用户就可以进行fragment变化的回退操作。

可以这样得到FragmentTransaction类的实例:

[java]  view plain  copy
 print ?
  1. FragmentManager  mFragmentManager = getSupportFragmentManager();  
  2. FragmentTransaction  mFragmentTransaction = mFragmentManager.beginTransaction();  

2、commit和executePendingTransactions的区别

用add(), remove(), replace()方法,把所有需要的变化加进去,然后调用commit()方法,将这些变化应用。
在commit()方法之前,你可以调用addToBackStack(),把这个transaction加入back stack中去,这个back stack是由activity管理的,当用户按返回键时,就会回到上一个fragment的状态。
你只能在activity存储它的状态(当用户要离开activity时)之前调用commit(),如果在存储状态之后调用commit(),将会抛出一个异常。
这是因为当activity再次被恢复时commit之后的状态将丢失。如果丢失也没关系,那么使用commitAllowingStateLoss()方法。

3、问什么在存储状态之后调用commit会报异常?

我们查看Android源码发现FragmentManager和FragmentTransaction是一个虚类
那他们在activity中的实例化代码是如何处理的呢?
首先是getSupportFragmentManager的方法
[java]  view plain  copy
 print ?
  1. /** 
  2.      * Return the FragmentManager for interacting with fragments associated 
  3.      * with this activity. 
  4.      */  
  5.     public FragmentManager getSupportFragmentManager() {  
  6.         return mFragments;  
  7.     }  


查找到mFragments。
final FragmentManagerImpl mFragments = new FragmentManagerImpl();
我们发现FragmentManagerImpl是继承于FragmentManager的一个实体类
[java]  view plain  copy
 print ?
  1. /** 
  2.  * Container for fragments associated with an activity. 
  3.  */  
  4. final class FragmentManagerImpl extends FragmentManager {  
  5.       
  6.     ........  
  7.   
  8.   
  9.     @Override  
  10.     public FragmentTransaction beginTransaction() {  
  11.         return new BackStackRecord(this);  
  12.     }  
  13.   
  14.   
  15.     ........  
  16.   
  17.   
  18.     }  


为了简便我们删除了一些不要的代码只留下关键的方法。
通过这段代码,我们可以查看到beginTransaction方法实际返回的是一个继承于FragmentTransaction的BackStackRecord类
我们来查看BackStackRecord的代码,查看他的用法
[java]  view plain  copy
 print ?
  1. /** 
  2.  * @hide Entry of an operation on the fragment back stack. 
  3.  */  
  4. final class BackStackRecord extends FragmentTransaction implements  
  5.         FragmentManager.BackStackEntry, Runnable {  
  6.   
  7.   
  8.     ..........  
  9.     public int commit() {  
  10.         return commitInternal(false);  
  11.     }  
  12.   
  13.   
  14.     public int commitAllowingStateLoss() {  
  15.         return commitInternal(true);  
  16.     }  
  17.   
  18.   
  19.     int commitInternal(boolean allowStateLoss) {  
  20.         if (mCommitted) throw new IllegalStateException("commit already called");  
  21.         if (FragmentManagerImpl.DEBUG) Log.v(TAG, "Commit: " + this);  
  22.         mCommitted = true;  
  23.         if (mAddToBackStack) {  
  24.             mIndex = mManager.allocBackStackIndex(this);  
  25.         } else {  
  26.             mIndex = -1;  
  27.         }  
  28.         mManager.enqueueAction(this, allowStateLoss);  
  29.         return mIndex;  
  30.     }  
  31.     ..........  
  32.   
  33.   
  34. }  


绕了大半天,终于找到commit方法和commitAllowingStateLoss方法,他们都同时调用了commitInternal方法,只是传的参数略有不同,一个是true,一个是false。我们发现在执行这个方法之前会首先对mCommitted进行判断,根据代码语义我们可以知道mCommitted就是是否已经commit的意思
最后,commitInternal调用了mManager.enqueueAction的方法。让我们回到FragmentManager,看这个方法是如何操作的。我们找到这个方法。
[java]  view plain  copy
 print ?
  1. /** 
  2.  * @hide Entry of an operation on the fragment back stack. 
  3.  */  
  4. final class BackStackRecord extends FragmentTransaction implements  
  5.         FragmentManager.BackStackEntry, Runnable {  
  6.   
  7.   
  8.     ..........  
  9.     public int commit() {  
  10.         return commitInternal(false);  
  11.     }  
  12.   
  13.   
  14.     public int commitAllowingStateLoss() {  
  15.         return commitInternal(true);  
  16.     }  
  17.   
  18.   
  19.     int commitInternal(boolean allowStateLoss) {  
  20.         if (mCommitted) throw new IllegalStateException("commit already called");  
  21.         if (FragmentManagerImpl.DEBUG) Log.v(TAG, "Commit: " + this);  
  22.         mCommitted = true;  
  23.         if (mAddToBackStack) {  
  24.             mIndex = mManager.allocBackStackIndex(this);  
  25.         } else {  
  26.             mIndex = -1;  
  27.         }  
  28.         mManager.enqueueAction(this, allowStateLoss);  
  29.         return mIndex;  
  30.     }  
  31.     ..........  
  32.   
  33.   
  34. }  


经分析后,我们可以发现,此方法在对 commit和commitAllowingStateLoss的传参进行判断后,将任务扔进activity的线程队列中。那这个两个方法区别就在传参判断后的处理方法checkStateLoss,那接下来,让我们查看一下checkStateLoss方法,看对参数进行判断后,做了什么样的处理。
[java]  view plain  copy
 print ?
  1. private void checkStateLoss() {  
  2.         if (mStateSaved) {  
  3.             throw new IllegalStateException(  
  4.                     "Can not perform this action after onSaveInstanceState");  
  5.         }  
  6.         if (mNoTransactionsBecause != null) {  
  7.             throw new IllegalStateException(  
  8.                     "Can not perform this action inside of " + mNoTransactionsBecause);  
  9.         }  
  10.     }  


ok,到这里,真相总算大明,当使用commit方法时,系统将进行状态判断,如果状态(mStateSaved)已经保存,将发生"Can not perform this action after onSaveInstanceState"错误。
如果mNoTransactionsBecause已经存在,将发生"Can not perform this action inside of " + mNoTransactionsBecause错误。
有限元分析-静力学分析-与分析解对比-——以阶梯轴的静力分析为例——静态结构分析 150mm,a=300mm{a=300mm}a=300mm,b=200mm{b=200mm}b=200mm,L=1000mm{L=1000mm}L=1000mm,F=300kN{F=300kN}F=300kN,材料为45,弹性模量E=2.1e11Pa{E=2.1e11Pa}E=2.1e11Pa,泊松比v=0.28{v=0.28}v=0.28,屈服应力δs=355MPa{δ_s=355MPa}δ。使用line body生成的模型,可以选择自动划分网格的,WB会将以梁单元将其划分完成,例如图2所示。 阅读详情

相关推荐

Widar3.0复现日志(DFSExtractionCode)

需要使用的matlab基本功能

XiaoQiXiaoWei_J的博客 2437

Android commitAllowingStateLoss 与 commit() 切换fragment 区别

这是因为FragmentManager会在状态保存后保存事务的回退栈,所以如果在状态保存后提交一个事务,那么这个事务就不会被保存在回退栈中。这可能会导致应用在恢复状态时出现不一致的状态。: 这个方法允许在状态已经被保存后提交事务,即使这可能会导致状态丢失。它不会抛出状态丢失的异常,但如果在状态保存后提交事务,那么这个事务就不会被保存在回退栈中,可能会导致应用在恢复状态时出现不一致的状态。通常来说,你应该尽量避免在状态已经保存后提交事务,因为这可能会导致应用的用户界面状态与实际的应用状态不一致。

丿灬安之若死 1829

Ubuntu安装ToDesk远程控制软件

前几天有同学问我怎么在 Ubuntu 系统上安装 ToDesk 远程控制软件, 帮他安装完成后就 顺手整理了一下安装过程,所以就顺手有了这篇在 Ubuntu 系统上安装 todesk 的文章。

小白的博客 8660

Android commit 和 commitAllowingStateLoss 的区别

会引起一种问题:因内存不足而把不显示在前台的 activity (带有 fragment)销毁,之后用户再回到此 activity 页面时,是会丢失在。商业转载请联系作者获得授权,非商业转载请注明出处。方法的注释上也写明,调用此方法会有丢失页面状态信息的风险。这明显是有点逃避问题,那么这个状态是什么判断而得出的呢?确实是不报错了,但是为什么呢?意思就是说我们不能在调用。不报错(睁一只眼闭一只眼)。网上的解决办法是使用。方法提交的页面状态信息!作者:chenxuxu。...

weixin_42190533的博客 1406

CARLA仿真:自定义地图与AI车辆行为编程

CARLA仿真:自定义地图与AI车辆行为编程 ,人工智能,计算机视觉,大模型,AI,本文围绕CARLA仿真平台,介绍了其基础功能与安装方法,详解地图系统,包括预设地图的加载切换及自定义地图的创建、导入与优化。还阐述了AI车辆的创建、属性设置、销毁,以及行为控制,如交通规则遵守、路径规划、复杂行为编程和行为树应用。同时涉及传感器与车辆感知、交通场景构建、自定义地图与AI行为结合应用、高级应用,以及常见问题解决方案和学习资源,为CARLA仿真应用提供全面指导。

不踩坑,不知道坑有多深;不总结,踩过的坑白踩。 11万+

一文读懂AI协同办公领域发展和趋势

协同办公,又称OA,是指企业内部或外部各类人员之间利用信息技术来进行协作工作的一种形式。这种协作工作既可以由直接员工进行,也可以来自外部的咨询机构、合作伙伴或联营企业。协同办公的优势在于可以对资源进行有效管理和配置,各部门之间可以建立良好的协作关系,跨部门更好地实现资源共享。

女王の专属领地 2363

android_基础_fragment commit()和commitAllowingStateLoss()方法区别

转载自: https://blog.youkuaiyun.com/Sean_css/article/details/79868946 从一个异常认识Android中的 commit() 和 commitAllowingStateLoss() 文章目录 从一个异常认识Android中的 commit() 和 commitAllowingStateLoss() 一、重现以及解决 二、原因分析 2.1 commitAllowingStateLoss 与 commit 的区别 2.2 Android 6.0 权限.

写bug的蚊子的博客 1888

前程无忧Python岗位数据采集:基于API直连的高效招聘信息爬取实战

本文介绍了一个基于Python requests库的前程无忧招聘数据采集系统。项目通过分析API接口结构,配置完整的请求头和身份验证参数,实现了高效稳定的数据采集。系统支持多页数据批量获取,包含工作名称、薪资范围等关键字段的结构化解析,并将结果存储为Excel文件。技术实现涉及API分析、身份验证、请求头配置、数据清洗等关键步骤,同时强调遵守法律和道德规范。该系统可为求职者、HR和市场分析师提供有价值的行业数据支持,适用于市场分析、职业规划等场景。

那些看似不起波澜的日复一日,会在某天让你看到坚持的意义 1552

commitAllowingStateLoss

使用commitAllowingStateLoss()函数原因:commit()函数和commitAllowingStateLoss()函数的唯一区别就是当发生状态丢失的时候,后者不会抛出一个异常。通常你不应该使用这个函数,因为它意味可能发生状态丢失。当然,更好的解决方案是commit函数确保在Activity的状态保存之前调用,这样会有一个好的用户体验。除非状态丢失的可能无可避免,否则就不应该使用

forLove 5521

结构力学仿真软件:STAAD.Pro:结构抗震设计与STAAD.Pro应用_2024-08-10_11-49-29.Tex

STAAD.Pro是一款广泛应用于结构工程领域的仿真软件,由Bentley Systems开发。它能够进行结构分析和设计,支持多种结构类型,包括桥梁、建筑物、塔架等。STAAD.Pro提供了强大的建模工具,用户可以轻松创建复杂的结构模型,并进行静态和动态分析。软件还支持多种载荷组合,包括地震载荷,以及提供详细的报告和图纸输出,便于工程师进行设计和审查。STAAD.Pro是一款广泛应用于结构工程设计的软件,其界面直观,功能强大,能够进行结构分析与设计。菜单栏。

977

【STM32 Blue Pill编程】-STM32CubeIDE开发环境搭建与点亮LED

本文为使用 STM32Cube IDE 的 STM32 Blue Pill 入门教程。 在本文中,我们将介绍如何控制 STM32 Blue Pill 的 GPIO 引脚。以及开发环境搭建。 本系列文章将重点介绍采用 ARM Cortex-M 的 BluepellSTM32F103C8 微控制器以及如何使用 STM32CubeIDE 对其进行编程。 STM32CubeIDE是STM32官网提供的IDE

视觉与物联智能 1070

从一个异常认识Android中的 commit() 和 commitAllowingStateLoss()

从一个异常认识Android中的 commit() 和 commitAllowingStateLoss() 从一个异常认识Android中的 commit() 和 commitAllowingStateLoss() 一、重现以及解决 二、原因分析 2.1 commitAllowingStateLoss 与 commit 的区别 2.2 Android 6.0 权限申请 三、总结 ...

Sean_css的博客 3168

把 ABAP 经验装进 GitHub Copilot 的按需大脑,Agent Skills 如何改变 ABAP 开发

2026 年 8 月,SAP Community 上出现了一次很有代表性的 ABAP 实验。开发者把标准 Flight Model 里的复制成自己的测试类,删除原有 ABAP Unit Test,再让 GitHub Copilot Agent 为方法重新生成测试代码。真正有意思的地方并不是 Copilot 会不会写,而是开发者给 Copilot 准备了两个专门的 Agent Skills,一个负责 ABAP Unit Test 的通用规则,一个负责 ABAP Test Double Framework。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 156

FragmentTransaction commit() 和commitAllowingStateLoss()的区别

两者的作用都是提交Fragment的commit操作,commitAllowingStateLoss允许丢失一些界面的状态和信息; 举例: fragment页面可能因某些特殊状况被销毁,然后系统会自发重新创建,此时会读取onSaveInstanceState保存的状态信息。在onSaveInstanceState执行之后再执行commit会发生异常(Can not perform this act...

lidongxiu0714 4370

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

BackStackRecord(继承自FragmentTransaction) 中commit()与commitAllowingStateLoss()的区别

@Override public int commit() { return commitInternal(false); } @Override public int commitAllowingStateLoss() { return commitInternal(true); } 从源代码来看,它们调用了同一...

Geek的专栏 695

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

FragmentTransaction的commit和commitAllowingStateLoss的差别

1、什么是FragmentTransaction? 使用Fragment时。能够通过用户交互来运行一些动作。比方添加、移除、替换等。 全部这些改变构成一个集合,这个集合被叫做一个transaction。 能够调用FragmentTransaction中的方法来处理这个transaction,而且能够将transaction存进由activity管理的back stack中,...

aodiyi6351的博客 228

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

commit和commitAllowingStateLoss方法的区别

commit和commitAllowingStateLoss方法的区别遇到的问题源码分析及验证总结 遇到的问题 java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState at android.support.v4.app.FragmentManagerImpl.ch...

百分百空手接白刃 1892

commit在c语言中的作用,commitallowingstateloss 和commit的区别

1、什么是FragmentTransaction?使用Fragment时,可以通过用户交互来执行一些动作,比如增加、移除、替换等。所有这些改变构成一个集合,这个集合被叫做一个transaction。可以调用FragmentTransaction中的方法来处理这个transaction,并且可以将transaction存进由activity管理的back stack中,这样用户就可以进行fragme...

weixin_39998273的博客 621

commitallowingstateloss 和commit的区别

前段时间有大佬反应在使用DialogFragment的时候使用show的时候有出现程序crash的问题,有大神给的解决方案是重写show方法,因为在show方法中实际调用的是FragmentTransaction的commit()方法,将其改用commitAllowingStateLoss就可以了。 其实这个问题到现在也在困扰我,那就是,他们之间有啥区别?带着这个问题我们来看看FragmentT

XuZhenhao 7427

源码分析commitAllowingStateLoss() 和commit()的区别

转载自: [源码分析commitAllowingStateLoss() 和commit()的区别][1] 作者:丿北纬91度灬 之前曾经看过这一块的源码和知识点,但是当时看完可能当时懂了一点但也有点懵,主要应该是当时对这块用的不多,对Fragment理解的不多,所以看完就忘了。果然今天再次看到的时候就有些忘记了,然后找了篇博客看看,讲的很好,起码我理解了。 以下为转载内容: 之前在使用...

相公 842
上一篇: 三分钟搞定安卓+iOS适配问题
下一篇: Fragment提交transaction导致state loss异常
lgzaaron
博客等级 码龄11年 13粉丝 34原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值