你可能漏掉的知识点: onResumeFragments

发布于 2024-10-09 10:49:08 字数 1607 浏览 18 评论 0

长话短说:如果你在使用 FragmentActivity 的任何子类(比如最新的 AppCompatActivity),并且你正在考虑要在 onResume 方法中做 fragment transaction 操作,那么请在 onResumeFragment 里做这件事情。

如果你想知道详情或者一些注意事项,继续阅读。如果不想,没关系,下篇文章见。

还在看?那么 ok。

onResume 和 onResumeFragments 的区别是什么呢?下面是 官方文档 对 FragmentActivity.onResume 的解释:

将 onResume() 分发给 fragment。注意,为了更好的和旧版本兼容,这个方法调用的时候,依附于这个 activity 的 fragment 并没有到 resumed 状态。着意味着在某些情况下,前面的状态可能被保存了,此时不允许 fragment transaction 再修改状态。从根本上说,你不能确保 activity 中的 fragment 在调用 Activity 的 OnResume 函数后是否是 onresumed 状态,因此你应该避免在执行 fragment transactions 直到调用了 onResumeFragments 函数。

总的来说就是,你无法确定 activity 当前的 fragment 在 activity onResume 的时候也跟着 resumed 了,因此要避免在 onResumeFragments 之前进行 fragment transaction,因为到 onResumeFragments 的时候,状态已经恢复并且它们的确是 resumed 了的。

这样做可以避免发生 IllegalStateException 异常,在一个 fragment 的状态已经保存的情况下(通过 onSaveInstanceState),再试图进行 fragment transaction 操作就会抛出这个异常。
如果 fragment 的 activity 销毁并重建,前面保存的变量将丢失。要想更深的理解这个问题,可以阅读 Alex Lockwood 的 Fragment Transactions 与 Activity 状态的丢失 一文。

其实我是在知道 fragments 和 fragment transaction 了很久之后才知道 onResumeFragments 这个东西的。activity 的绝大部分生命周期中都不涉及到它,因为它只存在于兼容包里面的 FragmentActivity,而 SDK 里面的 Activity 则没有。不过 onResumeFragments 仍然值得去了解。

说了这么多,我这几天只能给一点很粗贱的建议:尽可能的避免在生命周期事件中尤其是 onResume 或者 onResumeFragments 中进行 fragment transaction,如果你正在考虑这样做,很可能你的 UI 和事务逻辑都需要反思一遍了。

不过那时以后要说的事了。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

残疾

暂无简介

文章
评论
25 人气
更多

推荐作者

alipaysp_snBf0MSZIv

文章 0 评论 0

梦断已成空

文章 0 评论 0

瞎闹

文章 0 评论 0

寄意

文章 0 评论 0

似梦非梦

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文