Fragment already added也許是空指針異常導致的 總結

今天遇到一個問題,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.外層調用是在BackStackRecordexecuteOps()裏面,由於我分別add了4個,並hide了4個,這個ops的數組的長度是8。

可以看到下面代碼,是一個循環,來處理這些操作記錄,cmd=1是添加,cmd=4是隱藏。

然後我就發現了另一個怪事,本應該執行8次的循環,執行了2次就不執行了。也就是說……在這個循環裏面有異常發生了!循環被中斷了。

3.然後就發現了,它會調用到onHiddenChanged方法

跑到Apple的onHiddenChanged方法裏面一看,有個變量還沒初始化,空指針異常了~

總結

Fragment的初始化如果調用到hide是會回調onHiddenChanged方法的,onHiddenChanged方法裏面該判空的還是要判空。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章