ネモラムネ

AndroidのcommitとcommitAllowingStateLossの違い

#Android #Kotlin

2024-07-24

AndroidでFragmentをバックグラウンドとかでcommitするとエラーが出ちゃうよね
特によくあるのが非同期処理でDialogFragment.showするときかな

IllegalStateException: Can not perform this action after onSaveInstanceState

これを解決するためにとりあえずcommitをcommitAllowingStateLossにすることがあるよ

commitでもcommitAllowingStateLossでもsavedInstanceStateやargumentsを保持しようとするからほとんど違わないよ

じゃあ何が違うかというとcommitでは、
onSavedInstanceStateのあとにcommitするとエラーするよ。
commitAllowingStateLossだとエラーしないね。

なぜcommitだとエラーするのかというと、
状態損失によってcommitが失われてしまうかもしれないからだね

  1. アプリをバックグラウンドにする
  2. FragmentをcommitAllowingStateLoss(ここがcommitであればエラー)
  3. 画面回転(Activityを再構築して状態損失)

こうすると2でコミットしたフラグメントが表示されないよ
でも画面回転とかしなければ表示されるから、
とりあえず表示したいだけのダイアログだとcommitAllowingStateLossを使うことがあるね