Fragment 重复创建及内存问题总结

Fragment 这个组件相对很多开发这来说都比较熟悉,但是名字熟悉不代表用的熟练

在使用过程中遇到一些需要注意的地方,写在这里供自己记录,也供大家参考

一:Fragment重复创建问题

一般我们使用Fragment 作为页面主体 会这么写,


事实上在开发过程中大量可见这种写法

如果遇到切换横竖屏,或者切换国家语言等场景

此时观察打印的log

会发现出现了三个Fragment对象

其中有一个fragment在创建后立刻销毁了

这是因为Fragment 的Host 也就是Activty 会销毁并重启,在销毁时Activity会调用

onSaveInstanceState 保存当前的页面的Fragment各项数据

同时Activity在重启时,会调用super.onCreat(saveInstance)这时就会按照之前保存的Fragment数据恢复fragment

这个时候 如果我们再replace一次 那么系统自己创建的Fragment就又销毁了,看下源码

解决办法就是在创建时判断当前的saveInstances是否为空

再按照之前的方式操作,打印如下log,从log上已经符合预期

这种处理方式在google 的部分demo源码中也是如此 

二:Fragment内存问题

在目前开发的业务中,我们使用Fragment+后退栈的形式来代替Activity+后退栈

因为有循环开启页面的的可能,因此在内存上需要关注

在Fragment编写的过程中,有许多同学会参考Activity的编写模式,将大量的View和一些Data作为Fragment对象的属性来保存,如下图所示

这种方式,当Fragment被放入后退栈之后 Fragment对象持有大量的View对象和Data对象,无法释放,观察内存,随着页面逐级打开,内存吃紧,最终崩溃

在打开一定极限数量之后 最终奔溃 

 

 因此需要在onDestoryView时将内存回收,回收的方式就是断开View对象的强引用,如下图所示

这样后退栈中只会持有若干Fragment实例对象,但不会包含View等大对象,大大降低了内存消耗

但即使这样,依然不建议无限制的打开Fragment过多页面,因此在设计时就需要对可能出现循环打开的页面进行一定的限制

该经验对于Activity,也同样适用

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值