你可能漏掉的知识点: onResumeFragments

泡在网上的日子 / 文 发表于2015-06-16 15:00 次阅读 生命周期

原文: THINGS YOU MAY NOT KNOW: ONRESUMEFRAGMENTS 

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

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

还在看?那么 ok。

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

将onResume() 分发给fragment。注意,为了更好的和旧版本兼容,这个方法调用的时候,依附于这个activity的fragment并没有到resumed状态。着意味着在某些情况下,前面的状态可能被保存了,不允许fragment transaction再修改状态。为了在状态上正确 的和fragment交互,你应该重写onResumeFragments()而不是onResume() 。


总的来说就是,你无法确定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和事务逻辑都需要反思一遍了。

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



收藏 赞 (5) 踩 (1)
上一篇:美团Android DEX自动拆包及动态加载简介
概述 作为一个android开发者,在开发应用时,随着业务规模发展到一定程度,不断地加入新功能、添加新的类库,代码在急剧的膨胀,相应的apk包的大小也急剧增加, 那么终有一天,你会不幸遇到这个错误: 生成的apk在android 2.3或之前的机器上无法安装,提示IN
下一篇:Fragment Transactions与Activity状态的丢失
原文: Fragment Transactions Activity State Loss 这篇文章有三个翻译版本,分别在 博客园 、 伯乐在线 、还有 开源中国 。 我比较喜欢博客园 陈哈哈 的版本 。下面是陈哈哈的版本原文。 下面自从Honeycomb发布后,下面栈跟踪信息和异常信息已经困扰了Stac