相关文章推荐
英姿勃勃的白开水  ·  k8s-"hostNetwork: ...·  2 年前    · 
仗义的大蒜  ·  css 设置MP4 ...·  2 年前    · 

今日遇到一个问题,发现在点击APP过程中,程序崩溃了,并显示出如下问题。

java.lang.IllegalStateException: FragmentManager is already executing transactions
at android.support.v4.app.FragmentManagerImpl.ensureExecReady(FragmentManager.java:2006)
at android.support.v4.app.FragmentManagerImpl.execSingleAction(FragmentManager.java:2030)
at android.support.v4.app.BackStackRecord.commitNowAllowingStateLoss(BackStackRecord.java:651)
at android.support.v4.app.FragmentPagerAdapter.finishUpdate(FragmentPagerAdapter.java:143)
at android.support.v4.view.ViewPager.setAdapter(ViewPager.java:510)

搞不懂原因,因为堆栈层很多,而且,最初始的崩溃点在另一个Frament。

虽然很难,但显然这个问题应该有解决方案,于是,从网上搜索解决方案。

查了至少20篇资料,大致得出解决方案如下:

这是嵌套使用Fragment造成了,即在Activity里使用了多个Fragment,其中有若干个Fragment里又嵌套了多个Fragment。如下图所示:

 而造成这一崩溃的根本原因是在以一级Fragment里使用了getActivity().getSupportFragmentManager()。原来的工程师用这个是想操作二级Fragment,但实际是操作了一级Fragment,从而造成认为事务冲突而崩溃。

解决方法是:把getActivity().getSupportFragmentManager() 改为getchildfragmentmanager() 。

崩溃不再出现,问题解决。

参考资料:

[1]android - FragmentManager is already executing transactions. When is it safe to initialise pager after commit? - Stack Overflow

[2]https://segmentfault.com/q/1010000007719092

[3]https://www.py4u.net/discuss/604711

[4]https://www.reddit.com/r/androiddev/comments/kqz3sg/error_fragmentmanager_is_already_executing/

[5]FragmentManager is already executing transactions - 代码先锋网

今日遇到一个问题,发现在点击APP过程中,程序崩溃了,并显示出如下问题。java.lang.IllegalStateException: FragmentManager is already executing transactionsat android.support.v4.app.FragmentManagerImpl.ensureExecReady(FragmentManager.java:2006)at android.support.v4.app.FragmentManagerImpl
需求:滑动变化页面,tab栏随之变化(很一般的常见需求了) bug现象描述:(1)Fragment没有被创建和添加进viewPager,(2)有时候activity加载出来时crash,(3)有时候contain的Activity正常加载,试图滑动页面就crash Log信息: 11-23 18:50:53.667 15943-15943/? E/AndroidRuntime: FATA
1、错误信息 异常:Caused by: java.lang.IllegalStateException: Method has too many Body parameters Caused by: java.lang.IllegalStateException: Method has too many Body parameters: public abstract com.iot.framework.core.response.CommResponse com.iot.basic.config.api.client.configdata.PushRuleClient.getByEven
Android异常详情介绍 这种异常我遇到以下两种情况: 1. java.lang.IllegalStateException: No wrapped connection. 2.java.lang.IllegalStateException: Adapter is detached. 1.单线程一次执行一个请求可以正常执行,如果使用多线程,同时执行多个请求时就会出现连接超时. 2.HttpConnection没有连接池的概念,多少次请求就会建立多少个IO,在访问量巨大的情况下服务器的IO可能会耗尽。 3.通常是因为HttpClient访问单一实例的不同的线程或未关闭Input
纠结了半天的 java.lang.IllegalStateException: getOutputStream() has already。这个问题困扰了半天,在网上查阅了大量资料 出这个错误一般就是下面2个.....
java.lang.IllegalStateException: FragmentManager is already executing transactions at androidx.fragment.app.FragmentManagerImpl.ensureExecReady(FragmentManagerImpl.java:14) at androidx.fragment.app.FragmentManagerImpl.execSingleAction(...
今天在写一个Fragment中动态获取权限的时候,出现了 java.lang.IllegalStateException: FragmentManager is already executing transactions 这个异常错误,详细信息如下: 2018-11-27 09:51:05.018 11494-11494/com.hzy.larkpermission E/AndroidRunti...
@Override public void show(FragmentManager manager, String tag) { try { //在每个add事务前增加一个remove事务,防止连续的add manager.beginTransaction().remove(this).commit(); super.show(manager, tag); } catch (Exception e) {
  在复用SmartTabLayout 时, 出现了标题所示的错误。首先我的场景是Activity下两个fragment :A 和 B,A中使用了SmarttabLayout和viewpager结合, B也同样使用了这个结合, 然后就出现了B中滑动异常或不显示了, 网上的答案有几种情况:   一. viewpager的id不能相同   二. getFragmentManage...
commitNowAllowingStateLoss导致的FragmentManager is already executing transactions fragment版本1.3.6 Fatal Exception: java.lang.IllegalStateException FragmentManager is already executing transactions androidx.fragment.app.FragmentManager.ensureExecReady (F
错误原因:java.lang.illegalstateexception: compilesdkversion未指定。 这个错误是由于在Android项目中没有指定编译SDK版本所导致的。在Android项目中,编译SDK版本是必须指定的,否则会导致编译错误。要解决这个问题,需要在项目的build.gradle文件中指定编译SDK版本。例如: android { compileSdkVersion 30 在这个例子中,编译SDK版本被指定为30。你可以根据你的项目需要来指定不同的版本。 ### 回答2: 这个错误是由于在Android Studio项目的build.gradle文件中没有指定compilesdkversion所造成的。 compilesdkversion是指应用程序编译时所使用的Android SDK版本,这是非常重要的,因为它决定了应用程序所支持的最低API级别和兼容性。 通常,在创建一个新项目或导入一个现有项目时,build.gradle文件会自动设置compilesdkversion。但是,当在文件中修改项目的构建选项时,可能会发生意外的错误。如果未显式设置compilesdkversion,则会出现此错误。为了解决这个问题,可以在build.gradle文件中添加以下代码: android { compileSdkVersion 25 //其他选项 在这个例子中,compilesdkversion被设置为25。根据需要,将其设置为您的项目中所需的版本即可。重要的是,确保build.gradle文件与Android SDK Manager中已安装的Android SDK版本相匹配。 此外,还可以在文件中指定目标SDK版本和最低支持的SDK版本: android { compileSdkVersion 25 buildToolsVersion "25.0.3" defaultConfig { applicationId "com.example.myapp" minSdkVersion 21 targetSdkVersion 25 //其他选项 //其他选项 建议根据需要添加其他选项。 总之,出现java.lang.illegalstateexception:compilesdkversion未指定的错误,是由于在Android Studio项目的build.gradle文件中未指定compilesdkversion引起的。通过在build.gradle文件中添加代码并根据需要设置compilesdkversion、目标SDK版本和最低SDK版本,可以解决这个问题。 ### 回答3: “caused by: java.lang.illegalstateexception: compilesdkversion is not specified”这个错误提示是因为在项目的build.gradle文件中没有指定编译的SDK版本号。 在Android Studio中,每个项目都有一个build.gradle文件,该文件包含了项目的一些重要配置信息,如编译版本、依赖库等。其中,compileSdkVersion是指定用哪个版本的SDK来编译你的应用程序,如果没有指定,编译就无法进行。 因此,解决这个错误只需要在build.gradle文件中添加如下代码即可: android { compileSdkVersion 你指定的版本号 //省略其他代码 需要注意的是,编译版本必须与项目的依赖库版本兼容,否则会导致编译错误。因此,在指定编译版本之前,需要先确认项目所依赖的库及其版本号,再根据其要求来指定编译版本。 总之,这个错误提示其实是一个比较简单的问题,只需要在build.gradle文件中补充相应的配置信息即可。对于刚开始学习Android开发的新手而言,建议多研究一下这个文件的结构和用法,相信对进阶成为高级Android开发工程师会有很大的帮助。