Fragment already added也许是空指针异常导致的

今天遇到一个问题,Activity加载Apple,Boy,Cat,Dog四个Fragment的时候出现Fragment already added的异常。说Apple这个Fragment重复添加了。

一路断点跟代码,终于找到了原因。

1.首先找到出问题的地方,mAdded数组里面,如果已经有Apple这个Fragment了,再添加Apple进去,就会报错。

《Fragment already added也许是空指针异常导致的》 image.png

这里发现了一个怪事:
这个addFragment会调用两次,第一次的时候,数组为空,理应添加Apple, Boy, Cat, Dog四个Fragment,第二次再来的时候,数组里为什么只有一个Apple呢?应该有4个才对啊。

这时我推测:应该加入4个元素,但却只加入了1个元素,那就去外层调用看看吧。

2.外层调用是在BackStackRecordexecuteOps()里面,由于我分别add了4个,并hide了4个,这个ops的数组的长度是8。

可以看到下面代码,是一个循环,来处理这些操作记录,cmd=1是添加,cmd=4是隐藏。

《Fragment already added也许是空指针异常导致的》 image.png

然后我就发现了另一个怪事,本应该执行8次的循环,执行了2次就不执行了。也就是说……在这个循环里面有异常发生了!循环被中断了。

3.然后就发现了,它会调用到onHiddenChanged方法

《Fragment already added也许是空指针异常导致的》 image.png

跑到Apple的onHiddenChanged方法里面一看,有个变量还没初始化,空指针异常了~

总结

Fragment的初始化如果调用到hide是会回调onHiddenChanged方法的,onHiddenChanged方法里面该判空的还是要判空。

    原文作者:kross
    原文地址: https://www.jianshu.com/p/051ea2eb7d0a
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞