【发布时间】:2015-09-28 01:07:01
【问题描述】:
在另一个线程上完成网络请求后,我的 Activity 中有一个侦听器替换 Fragment。所以这个监听器正在调用这样一行代码:
getFragmentManager().beginTransaction().replace(R.id.container, fragment, fragmentTag).commit();
这行代码中的 commit() 偶尔会抛出 IllegalStateException。根据the docs,
事务只能在其包含的活动保存其状态之前使用此方法提交。如果在该点之后尝试提交,则会引发异常。这是因为如果活动需要从其状态恢复,则提交后的状态可能会丢失。请参阅 commitAllowingStateLoss() 以了解可能会丢失提交的情况。
在研究这个问题时,我遇到了FragmentManager.isDestroyed() 方法。 javadocs 阅读:
如果对 FragmentManager 的 Activity 进行了最终的 Activity.onDestroy() 调用,则返回 true,因此该实例现在已死。
我想我只是对 FragmentManager 的 Activity 实例死亡的含义有点困惑。我们什么时候应该使用 FragmentManager.isDestroyed()?在提交替换 FragmentTransaction 之前检查它会避免 IllegalStateException 吗?
【问题讨论】:
-
你应该发布你的 logcat 错误
-
我一直在经历同样的事情......我发现这是完全正确的:在我所有 FragmentManager.isDestroyed() 返回 true 的情况下,FragmentTransaction.commit() 将抛出 IllegalStateException .实际上,首先检查 .isDestroyed() 将帮助您避免异常,但您也不会执行 Fragment 事务。
-
@alpartis 我将添加一些更好的日志记录,看看当我收到 IllegalStateException 时 FragmentManager.isDestroyed() 是否返回 true。不过,您的评论似乎足以成为答案。如果您将它作为一个发布,并且在一段时间内没有人发布更好的,我会接受它。