2013年8月11日日曜日

色々考える

前提条件
データを表示するフラグメントがあるとする。
このフラグメントはデータの追加、更新、削除を行う機能をもつ。
レイアウトのケースはどうなるか。

ケース1
ListView置いて、CursorLoaderを接続する。
更新の場合は、裏でDB更新。更新完了時に表示されてるレイアウトを上書き。
追加と削除はDataSetChangeで表示をフル更新。
ActivityCreatedで常に最新のデータを取得する。


ケース2
FlameLayoutを置いて、LinearLaytouを持つSchrolViewを配置。AsyncTaskLoaderを接続する。
AsyncTaskLoaderは表示するデータのレイアウトを丸々キャッシュ。
更新の場合はケース1と同じ。
削除の場合は、裏でDB更新。更新完了時にキャッシュと表示の両方でremoveView。
追加の場合は、裏でDB更新。更新完了時にキャッシュと表示の両方でaddView。

ケース1のメリット
1高速。
2導入が簡単。
3作成時間も短い。
4ライフサイクルの管理も全部おまかせで大丈夫。

ケース2のメリット
1アニメーションの付与でリッチに。
2レイアウトのフル更新が少ない。
3レイアウトのキャッシュが効いてるのでインスタンスの取得だけでいい。

ケース1のデメリット
1表情にとぼしい。
2GCが多い。
3一からレイアウトを組み直す必要がある。

ケース2のデメリット
1キャッシュが通常の2倍以上。
2作るのがめんどくさい。
3ライフサイクルやシングルトンに疑問が残る。

ぱっと思いつくとこんなもん。
ケース2のメリットの2に関してはレイアウトの位置を変更するから、これはデータの全更新と同じような感じじゃないだろうか。
ケース2のキャッシュはかなり致命的な感じが。。。メモリの占有が多いってことは他のサービスがぶっちされるからユーザーとしてはうれしくない。スレッドだろうがサービスだろうが同じ。foregroundでもやだ。しかし、ローダーを使う以上何かしらキャッシュは効かしてるからしょうがないと割り切ればそんなもんだったりするのだろうか。

0 件のコメント:

コメントを投稿