今天遇到一個問題,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
方法裏面該判空的還是要判空。