摘要:这个是由什么原因造成的呢如果想知道造成异常的原因,那就必须去看的相关代码,发现在之后都会被掉,但是它并没有对做,所以会造成的状态错误。
Activty嵌套多个Fragment,然后Fragment里面再嵌套多个Fragment,外层的Fragment切换得快了或者横竖屏切换就会报错:
java.lang.IllegalStateException: Activity has been destroyed
at android.support.v4.app.FragmentManagerImpl.enqueueAction(FragmentManager.java:1460)
at android.support.v4.app.BackStackRecord.commitInternal(BackStackRecord.java:634)
at android.support.v4.app.BackStackRecord.commit(BackStackRecord.java:613)
报错的是外层Fragment内的下面这段代码:
IndexListFragment indexHotFragment = new IndexListFragment(); Bundle bundle = new Bundle(); switch (id) { case 1: bundle.putSerializable("list", audit_handles); bundle.putInt("id", 1); break; case 2: bundle.putSerializable("list", pos_handles); bundle.putInt("id", 2); break; case 3: bundle.putSerializable("list", audit_lists); bundle.putInt("id", 3); break; case 4: bundle.putSerializable("list", pos_lists); bundle.putInt("id", 4); break; default: break; } indexHotFragment.setArguments(bundle); FragmentManager fragmentManager = getChildFragmentManager(); FragmentTransaction ft = fragmentManager.beginTransaction(); ft.replace(flContainer, indexHotFragment); ft.commit();
产生异常的原因是什么呢?根据查阅的资料网上是这么说的
当使用一个Fragment去嵌套另一个子Fragment时,我们需要管理子Fragment,这就需要调用ChildFragmentManager来管理这些子Fragment,但是由此就可能引起一个Exception:
java.lang.IllegalStateException: No activity
首先我们来分析一下Exception产生的原因:
通过debug发现,当第一次从Activity启动Fragment,然后再去启动子Fragment的时候,存在指向Activity的变量,但当退出Fragment之后回到Activity,然后再进入Fragment的时候这个变量就变成null,这就是产生No Activity的原因。
这个Exception是由什么原因造成的呢?如果想知道造成异常的原因,那就必须去看Fragment的相关代码,发现Fragment在detached之后都会被reset掉,但是它并没有对ChildFragmentManager做reset,所以会造成ChildFragmentManager的状态错误。
找到异常出现的原因后就可以很容易的去解决问题了,我们需要在外层的Fragment被detached的时候去重置ChildFragmentManager,即:
@Override public void onDetach() { super.onDetach(); try { Field childFragmentManager = Fragment.class.getDeclaredField("mChildFragmentManager "); childFragmentManager.setAccessible(true); childFragmentManager.set(this, null); } catch (NoSuchFieldException e) { throw new RuntimeException(e); } catch (IllegalAccessException e) { throw new RuntimeException(e); } }
但是经过试验,这个方法并没有效果
为什么在onDetach行不通呢,因为按照activity跟fragment的生命周期图来看,onDetach阶段fragment已经与activity脱离关系即fragment持有的activity对象已被置null,而onDestroyView阶段fragment中仍然保留与activity之间的关系,此时fragment持有的activity对象仍然有效,那么把这段代码放在onDestoryed里面吧,但还是不行,
通过管理childFragmentManager的方法是行不通了,于是我想到了另外一种方法:判断Fragment所在的Activity是否存在,在调用上面报错的一段代码之前加上判断if(getActivity != null && getActivity().isFinishing());
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/13085.html
摘要:换句话说,环境或应用程序没有处于请求操作的适当状态。项目中异常分析引发崩溃日志的流程分析解决办法常见的出现场景状态异常非法线程操作。导致的方法出来显示消息位于该消息之后,迟迟没有执行。这时候,的超时检测结束,删除了服务中的记录。 目录介绍 1.1 java.lang.UnsatisfiedLinkError找不到so库异常 1.2 java.lang.IllegalStateExce...
摘要:详细崩溃日志信息查看崩溃类信息当调用或其变体之一失败时,会引发此异常,因为无法找到执行给定意图的活动。引发崩溃日志的流程分析问题所在是方法。 目录介绍 1.1 OnErrorNotImplementedException【 Cant create handler inside thread that has not called Looper.prepare()】 1.2 adb.e...
摘要:项目中异常分析引发崩溃日志的流程分析解决办法常见的出现场景状态异常非法线程操作。引发崩溃日志的流程分析解释如下所示,释放与此位图关联的本机对象,并清除对像素数据的引用。 目录介绍 1.1 java.lang.UnsatisfiedLinkError找不到so库异常 1.2 java.lang.IllegalStateException非法状态异常 1.3 android.conten...
摘要:使用提供了中对象池管理方式,它们的使用方式基本一样,这里以对象池为例介绍其使用方式,一般实现自己的对象池需要经过个步骤实现接口该接口是一种工厂模式,实现其目的是让对象池通过该工厂模式创建管理的对象创建对象池实例创建对象池我们假设对象是一 common-pool2 使用 common-pool2提供了3中对象池管理方式,它们的使用方式基本一样,这里以GenericObjectPool对象...
摘要:出现错误引发崩溃日志的流程分析这个错误是应用的方法总数限制造成的。 目录介绍 1.1 java.lang.ClassNotFoundException类找不到异常 1.2 java.util.concurrent.TimeoutException连接超时崩溃 1.3 java.lang.NumberFormatException格式转化错误 1.4 java.lang.Illegal...
阅读 2875·2023-04-26 01:30
阅读 508·2021-11-08 13:15
阅读 1482·2021-09-24 10:35
阅读 662·2021-09-22 15:41
阅读 1818·2019-08-30 15:44
阅读 352·2019-08-30 13:22
阅读 885·2019-08-30 13:06
阅读 1082·2019-08-29 13:22