2013年5月12日日曜日

[Android]FragmentTransactionをロールバックする


そういえば。FragmentTransactionのrollbackってどうやってやるんだろう?
と思ってFragmentTransactionのリファレンスを見てみました。
きっとrollbackみたいなメソッドがあるんだろうなぁ。と思って眺めていても見つからない。
で、いろんなサイトを見渡してみると、
 ロールバック=FragmentTransaction#commitを呼ばない。
ということらしい。

「トランザクション=DB」みたいな感覚があるので、commitもrollbackもしないなんて、なんか気持ち悪いなぁと思って調べてみました。

一般的にFragmentの操作は以下のように行います。
  • FragmetnManarerを取得する
  • FragmetnManarer#beginTransactionでFragmentTransactionを取得する
  • FragmentTransaction#addなどで、Fragmentの操作を行う
  • FragmentTransaction#commitを呼ぶ→UIが切り替わる
です。

調べてみると、FragmentTransactionの実装クラスBackStackRecordでは、Fragmentの操作をリストで管理しており、実装は以下のようになっていました。
  • add/replase/deleteが呼ばれるたびに、内部のリンクリストへ情報を追加
  • commitでためていたリストをFragmentManagerへ渡す
  • FragmentManagerはHandler経由でUI処理
という感じでした。

一口にトランザクションって言っても実装方法はそれぞれですが、インタフェースとしての対称性としてどうなのか?と思ってしまいます。
  • FragmetnManarerでbeginTransactionするのに、commitはFragmentTransaction
  • FragmentTransactionにもFragmetnManarerにもrollbackがない
デザイン的に、Builderです。という風に言われるとなるほどそうかもしれない。と思えます(クラス名的にダメじゃないと思いますが)。
たとえばAlertDialog.Builderでいろいろ値を設定し、createやshowを呼ばなかったら。と同じですね。

0 件のコメント: