commit related

[commit(), commitNow()和commitAllowingStateLoss()]

關于FragmentTransaction的各種提交方法: commit(),commitAllowingStateLoss(),commitNow()commitNowAllowingStateLoss().
作者Bryan Herbst發(fā)了一個blog The many flavors of commit()討論這幾個方法的特點和用途.
下文是中文摘要.

FragmentTransaction的提交方法

support library的FragmentTransaction現(xiàn)在提供了四種不同的方法來commit一個transaction:
commit()
commitAllowingStateLoss()
commitNow()
commitNowAllowingStateLoss()

這篇文章分析了這四個方法的不同.

commit() vs commitAllowingStateLoss()

commit()提交有時候會遇到IllegalStateException, 說你在onSaveInstanceState()之后提交, 這里有另一個文章很好地分析了這個問題:Fragment Transactions & Activity State Loss
commit()commitAllowingStateLoss()在實現(xiàn)上唯一的不同就是當你調用commit()的時候, FragmentManger會檢查是否已經存儲了它自己的狀態(tài), 如果已經存了, 就拋出IllegalStateException.
那么如果你調用的是commitAllowingStateLoss(), 并且是在onSaveInstanceState()之后, 你可能會丟失掉什么狀態(tài)呢?
答案是你可能會丟掉FragmentManager的狀態(tài), 即save之后任何被添加或被移除的Fragments.
舉例說明:
1.在Activity里顯示一個FragmentA;
2.然后Activity被后臺, onStop()onSaveInstanceState()被調用;
3.在某個事件觸發(fā)下, 你用FragmentB replace FragmentA , 使用的是 commitAllowingStateLoss().
這時候, 用戶再返回應用, 可能會有兩種情況發(fā)生:
1.如果系統(tǒng)殺死了你的activity, 你的activity將會重建, 使用了上述步驟2保存的狀態(tài), 所以A會顯示, B不會顯示;
2.如果系統(tǒng)沒有殺死你的activity, 它會被提到前臺, FragmentB就會顯示出來, 到下次Activity stop的時候, 這個包含了B的狀態(tài)就會被存下來.
(上述測試可以利用開發(fā)者選項中的”Don’t Keep Activities”選項).
那么你要選擇哪一種呢? 這就取決于你提交的是什么, 還有你是否能接受丟失.

commit(), commitNow() 和 executePendingTransactions()

使用commit()的時候, 一旦調用, 這個commit并不是立即執(zhí)行的, 它會被發(fā)送到主線程的任務隊列當中去, 當主線程準備好執(zhí)行它的時候執(zhí)行.
popBackStack()的工作也是這樣, 發(fā)送到主線程任務隊列中去. 也即說它們都是異步的.

但是有時候你希望你的操作是立即執(zhí)行的, 之前的開發(fā)者會在commit()調用之后加上 executePendingTransactions()來保證立即執(zhí)行, 即變異步為同步.
support library從v24.0.0開始提供了 commitNow()方法, 之前用executePendingTransactions()會將所有pending在隊列中還有你新提交的transactions都執(zhí)行了, 而commitNow()將只會執(zhí)行你當前要提交的transaction. 所以commitNow()避免你會不小心執(zhí)行了那些你可能并不想執(zhí)行的transactions.

但是你不能對要加在back stack中的transaction使用commitNow(), 即addToBackStack()commitNow()不能同時使用.
為什么呢?
想想一下, 如果你有一個提交使用了commit(), 緊接著又有另一個提交使用了commitNow(), 兩個都想加入back stack, 那back stack會變成什么樣呢? 到底是哪個transaction在上, 哪個在下? 答案將是一種不確定的狀態(tài), 因為系統(tǒng)并沒有提供任何保證來確保順序, 所以系統(tǒng)決定干脆不支持這個操作.

前面提過popBackStack()是異步的, 所以它同樣也有一個同步的兄弟popBackStackImmediate().

所以實際應用的時候怎么選擇呢?

  1. 如果你需要同步的操作, 并且你不需要加到back stack里, 使用commitNow().
    support library在FragmentPagerAdapter里就使用了commitNow()來保證在更新結束的時候, 正確的頁面被加上或移除.
  2. 如果你操作很多transactions, 并且不需要同步, 或者你需要把transactions加在back stack里, 那就使用commit().
  3. 如果你希望在某一個指定的點, 確保所有的transactions都被執(zhí)行, 那么使用executePendingTransactions().
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末缠犀,一起剝皮案震驚了整個濱河市欧瘪,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌捉捅,老刑警劉巖冶匹,帶你破解...
    沈念sama閱讀 212,029評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件习劫,死亡現(xiàn)場離奇詭異,居然都是意外死亡嚼隘,警方通過查閱死者的電腦和手機诽里,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,395評論 3 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來飞蛹,“玉大人谤狡,你說我怎么就攤上這事∥蚤埽” “怎么了墓懂?”我有些...
    開封第一講書人閱讀 157,570評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長霉囚。 經常有香客問我捕仔,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,535評論 1 284
  • 正文 為了忘掉前任榜跌,我火速辦了婚禮闪唆,結果婚禮上,老公的妹妹穿的比我還像新娘钓葫。我一直安慰自己悄蕾,他們只是感情好,可當我...
    茶點故事閱讀 65,650評論 6 386
  • 文/花漫 我一把揭開白布瓤逼。 她就那樣靜靜地躺著笼吟,像睡著了一般。 火紅的嫁衣襯著肌膚如雪霸旗。 梳的紋絲不亂的頭發(fā)上贷帮,一...
    開封第一講書人閱讀 49,850評論 1 290
  • 那天,我揣著相機與錄音诱告,去河邊找鬼撵枢。 笑死,一個胖子當著我的面吹牛精居,可吹牛的內容都是我干的锄禽。 我是一名探鬼主播,決...
    沈念sama閱讀 39,006評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼靴姿,長吁一口氣:“原來是場噩夢啊……” “哼沃但!你這毒婦竟也來了?” 一聲冷哼從身側響起佛吓,我...
    開封第一講書人閱讀 37,747評論 0 268
  • 序言:老撾萬榮一對情侶失蹤宵晚,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后维雇,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體淤刃,經...
    沈念sama閱讀 44,207評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,536評論 2 327
  • 正文 我和宋清朗相戀三年吱型,在試婚紗的時候發(fā)現(xiàn)自己被綠了逸贾。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,683評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡津滞,死狀恐怖铝侵,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情触徐,我是刑警寧澤咪鲜,帶...
    沈念sama閱讀 34,342評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站锌介,受9級特大地震影響嗜诀,放射性物質發(fā)生泄漏。R本人自食惡果不足惜孔祸,卻給世界環(huán)境...
    茶點故事閱讀 39,964評論 3 315
  • 文/蒙蒙 一隆敢、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧崔慧,春花似錦拂蝎、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,772評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至皇钞,卻和暖如春悼泌,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背夹界。 一陣腳步聲響...
    開封第一講書人閱讀 32,004評論 1 266
  • 我被黑心中介騙來泰國打工馆里, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人可柿。 一個月前我還...
    沈念sama閱讀 46,401評論 2 360
  • 正文 我出身青樓鸠踪,卻偏偏與公主長得像,于是被迫代替她去往敵國和親复斥。 傳聞我的和親對象是個殘疾皇子营密,可洞房花燭夜當晚...
    茶點故事閱讀 43,566評論 2 349