そういえば。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 件のコメント:
コメントを投稿