今天遇到一个问题,Activity加载Apple,Boy,Cat,Dog四个Fragment的时候出现Fragment already added的异常。说Apple这个Fragment重复添加了。
一路断点跟代码,终于找到了原因。
1.首先找到出问题的地方,mAdded数组里面,如果已经有Apple这个Fragment了,再添加Apple进去,就会报错。
image.png
这里发现了一个怪事:
这个addFragment会调用两次,第一次的时候,数组为空,理应添加Apple, Boy, Cat, Dog四个Fragment,第二次再来的时候,数组里为什么只有一个Apple呢?应该有4个才对啊。
这时我推测:应该加入4个元素,但却只加入了1个元素,那就去外层调用看看吧。
2.外层调用是在BackStackRecord的executeOps()里面,由于我分别add了4个,并hide了4个,这个ops的数组的长度是8。
可以看到下面代码,是一个循环,来处理这些操作记录,cmd=1是添加,cmd=4是隐藏。
image.png
然后我就发现了另一个怪事,本应该执行8次的循环,执行了2次就不执行了。也就是说……在这个循环里面有异常发生了!循环被中断了。
3.然后就发现了,它会调用到onHiddenChanged方法
image.png
跑到Apple的onHiddenChanged方法里面一看,有个变量还没初始化,空指针异常了~
总结
Fragment的初始化如果调用到hide是会回调onHiddenChanged方法的,onHiddenChanged方法里面该判空的还是要判空。












网友评论