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