? ?最近在做一個(gè)項(xiàng)目需要在一個(gè)界面中嵌套多個(gè)Fragment,但是在Fragment之間切換的時(shí)候出現(xiàn)了一個(gè)bug很棘手。話不多說直接貼上bug詳情如下:

? ?我們可以知道這個(gè)bug是Fragment之前切換的時(shí)候調(diào)用commitAllowingStateLoss()產(chǎn)生的,我們來看看commitAllowingStateLoss()的源碼

繼續(xù)往下看commitInternal(true)源碼

我們發(fā)現(xiàn)最終會(huì)走到enqueueAction()這個(gè)方法,我們繼續(xù)看源碼:

? ? ?哈哈,這個(gè)時(shí)候有沒有發(fā)現(xiàn)眼前一亮啊,終于找到bug問題的所在了吧!但是有一個(gè)問題是不是沒弄明白呢?為那就是為啥mDestroyed為true或者mHost==null,別急我們繼續(xù)往下查找,我們首先要看一下給mDestroyed賦值和mHost置空的地方,結(jié)果皇天不負(fù)有心人??!我們發(fā)現(xiàn)在FragmentManager里面有一個(gè)方法dispatchDestroy()里面有隊(duì)mDestroyed和mhost做了處理。

? ? 接下來我們就要查看為什么回調(diào)用dispatchDestroy()這個(gè)方法。我們都知道一個(gè)Activity銷毀掉會(huì)走onDestroy()這個(gè)方法,如下:

? ? ?看到這里是不是就很清晰了原來是調(diào)用commitAllowingStateLoss()的時(shí)候activity已經(jīng)銷毀掉了,至于activity為啥會(huì)銷毀那就要看一下原因了,如果沒找到原因那么可以在執(zhí)行commitAllowingStateLoss()時(shí)做一個(gè)activity非空的判斷。至此一個(gè)復(fù)雜的bug被處理掉了。