記錄一次關(guān)于底部導(dǎo)航切換的crash:Fragment already added。
觸發(fā):打開app,快速點(diǎn)擊底部按鈕切換fragment的時(shí)候 大概率會(huì)出現(xiàn)這個(gè)問題。
排查過程:出現(xiàn)這個(gè)crash的時(shí)候,一開始想到的便是在 supportFragmentManager.beginTransaction().add前判斷是否已經(jīng)添加過fragment.isAdded,查看代碼發(fā)現(xiàn)這個(gè)邏輯已經(jīng)存在...就有點(diǎn)意思了!然后通過日志發(fā)現(xiàn),確實(shí)是add了多次,經(jīng)過查閱知道commit執(zhí)行的是一個(gè)延時(shí)的異步操作,
Schedules a commit of this transaction. The commit does not happen immediately;
it will be scheduled as work on the main thread to be done the next time that thread is ready.
這樣就可能導(dǎo)致快速點(diǎn)擊的時(shí)候上次可能還沒commit完成,所以解決思路便是讓它立即執(zhí)行。

image.png
解決辦法:1.
supportFragmentManager.executePendingTransactions()立即執(zhí)行 。這個(gè)是我自己采用的方式;2.這個(gè)問題是在一個(gè)老項(xiàng)目中發(fā)現(xiàn)的,然后就順手看了一下自己近期新搭建的項(xiàng)目,是采用一打開app便把所有fragment先add進(jìn)去,這樣的話也不會(huì)出現(xiàn)這個(gè)crash,性能上硬考慮比較,那肯定還是1好一些!