fragmentManager? 進(jìn)行事務(wù)提交時(shí)整袁,transaction有四種commit方法可供調(diào)用寄猩,分別是:
commit()? ? 、 commitAllowingStateLoss()? ? 绑改、commitNow()? 蛙吏、? ?commitNowAllowStateloss()
這四個(gè)方法有什么區(qū)別呢:
(1)先說commit()? 和? commitAllowingStateLoss(),區(qū)別就是用commit時(shí)稽物,有可能會(huì)報(bào)IllegalStateException,原因是他們?cè)趯?shí)現(xiàn)的不同點(diǎn)在于奄毡,當(dāng)調(diào)用commit的時(shí)候,F(xiàn)ragmentManager會(huì)檢查是否已經(jīng)存儲(chǔ)了他自己的狀態(tài)姨裸,如果已經(jīng)存了(已經(jīng)調(diào)用過FragmentManager的? saveAllState()方法(對(duì)應(yīng)Activity的onSaveInstanceState)秧倾,或者調(diào)用過dispatchStop()方法(對(duì)應(yīng)Activity的onStop()方法)怨酝,)傀缩,就會(huì)拋出異常。所以推薦使用?commitAllowingStateLoss()农猬,但是用commitAllowingStateLoss()也會(huì)引發(fā)狀態(tài)丟失的問題赡艰,例如
????????1.在Activity里顯示一個(gè)FragmentA;
????????2.然后Activity被后臺(tái), onStop()和onSaveInstanceState()被調(diào)用;
????????3.在某個(gè)事件觸發(fā)下, 你用FragmentB replace FragmentA , 使用的是 commitAllowingStateLoss().
這時(shí)候, 用戶再返回應(yīng)用, 可能會(huì)有兩種情況發(fā)生:
????????1.如果系統(tǒng)殺死了你的activity, 你的activity將會(huì)重建, 使用了上述步驟2保存的狀態(tài), 所以A會(huì)顯示, B不會(huì)顯示;
? ? ? ? ?2.如果系統(tǒng)沒有殺死你的activity, 它會(huì)被提到前臺(tái), FragmentB就會(huì)顯示出來, 到下次Activity stop的時(shí)候, 這個(gè)包含了B的狀態(tài)就會(huì)被存下來.
那么你要選擇哪一種呢? 這就取決于你提交的是什么, 還有你是否能接受丟失.
(2)commit()? 與commitNow()? 的區(qū)別在于:
commit不是立即執(zhí)行,會(huì)被發(fā)送到主線程的任務(wù)隊(duì)列中去斤葱,當(dāng)主線程準(zhǔn)備好的時(shí)候開始執(zhí)行慷垮,也就是異步的。但是有時(shí)候你希望操作是立即執(zhí)行的揍堕,則就可以調(diào)用commitNow料身。
這里還有個(gè)注意情況,就是不能對(duì)要加在backStack中的transaction使用commitNow衩茸,即addToBackStack不能和commitNow同時(shí)使用芹血,(原因是在addToBackStack中將mAddToBackStack 設(shè)置為true,而此時(shí)再調(diào)用commitNow方法時(shí)楞慈,如果mAddToBackStack 為true幔烛,則直接拋出異常)。