? ?最近在做一個項目需要在一個界面中嵌套多個Fragment,但是在Fragment之間切換的時候出現了一個bug很棘手。話不多說直接貼上bug詳情如下:
? ?我們可以知道這個bug是Fragment之前切換的時候調用commitAllowingStateLoss()產生的,我們來看看commitAllowingStateLoss()的源碼
繼續往下看commitInternal(true)源碼
我們發現最終會走到enqueueAction()這個方法,我們繼續看源碼:
? ? ?哈哈,這個時候有沒有發現眼前一亮啊,終于找到bug問題的所在了吧!但是有一個問題是不是沒弄明白呢?為那就是為啥mDestroyed為true或者mHost==null,別急我們繼續往下查找,我們首先要看一下給mDestroyed賦值和mHost置空的地方,結果皇天不負有心人啊!我們發現在FragmentManager里面有一個方法dispatchDestroy()里面有隊mDestroyed和mhost做了處理。
? ? 接下來我們就要查看為什么回調用dispatchDestroy()這個方法。我們都知道一個Activity銷毀掉會走onDestroy()這個方法,如下:
? ? ?看到這里是不是就很清晰了原來是調用commitAllowingStateLoss()的時候activity已經銷毀掉了,至于activity為啥會銷毀那就要看一下原因了,如果沒找到原因那么可以在執行commitAllowingStateLoss()時做一個activity非空的判斷。至此一個復雜的bug被處理掉了。