2015年3月29日日曜日

Bundleに頼らないBitmapの扱い方

必要になった背景

  • Nudiaという画像編集アプリを作ったが、!!! FAILED BINDER TRANSACTION !!!が頻発した
  • 画像を利用するActivityやFragmentそれぞれでメンバ変数にBitmapを保持しており、それら全てでBundleにBitmapを格納していたことが原因
Bundleに保存していると、アプリがシステムから落とされた場合でも、データをリストアすることできるのでとても便利ではある。しかし、Bungleに格納できるデータ容量は有限のため、Bundleに頼らないBitmapの保持方法を考えなければいけない。

考えた案

  1. 編集都度ファイルに保存し、必要な度ファイルからBitmapを読み込む
  2. Bitmapをホストするシングルトンクラスを作りそこを通してアクセスするようにする
1については頻繁に更新読み込みをするため現実的ではないので不採用。消去法的に2になるが一つ問題が出てきた。
その問題とはシングルトン自体がシステムから解放されてしまった場合、ホストされているBitmapも一緒にメモリから消えてしまうことだった。


この問題に対して次の図のように対応をした。
シングルトンとホストされるBitmapは変わらないが、メモリが少なくなってきたこと等をトリガとしてアプリのデータ領域にBitmapのキャッシュを持つようにした。
また、アプリのシステムからの終了後の復帰時にはホストするBitmapがnullであった場合にキャッシュからデータを読み込む様にした。

いまのところ差し当たり問題はないが、今後他のユースケースで問題が出てくるかもしれないので注意が必要。


0 件のコメント:

コメントを投稿