イメージレジストリ
「イメージの扱い方」で紹介したように,イメージリソースは利用されなくなったら速やかにdisposeメソッドを呼び出して解放してあげなければならない。しかし,CやC++のfreeやdeleteなどのメモリ割り当ての解放作業をしたくないがためにJavaのGC(ガーベージコレクション)ができたように,イメージリソースに関しても勝手に解放してくれるような機構が欲しくなるものである。また,イメージリソースは複数の利用箇所で同一リソースを共有することができるということを考えると,実はイメージリソースの解放のタイミングは一概に決められない,といった状況も発生してくる。
そこでEclipseでは,イメージリソースを一括管理してくれるImageRegistryクラスが提供されている。ImageRegistryクラスを使うと,イメージの登録と取得,登録されたイメージの自動一括解放ができるようになる。
// レジストリの準備
ImageRegistry registry = new ImageRegistry();
// イメージの登録
ImageDescriptor descriptor = ...; // 「イメージの扱い方」参照
registry.put("smile", descriptor);
// イメージの取得
Image image = registry.get("smile");
使い方としては,まずImageRegistryクラスのインスタンスを生成する。そして「イメージの扱い方」で取り上げたImageDescriptorオブジェクトを生成し,putメソッドを使ってImageRegistryオブジェクトを登録する。この際,イメージの名前(何でも良い)をつけておく。
そしてイメージを利用したいときには,ImageRegistryオブジェクトからgetメソッドに登録時につけた名前を渡すことで,イメージが自動的に生成されてImageオブジェクトを得ることができる。過去にgetメソッドで取得したイメージについては,新たにイメージリソースが作成されるのではなく,内部で保持されているイメージリソースが使いまわされる。
ImageRegistryクラスには,getメソッドとputメソッドしかない。登録されたイメージの破棄に関しては,完全自動化が実現されている。Imageオブジェクトの生成には,Deviceオブジェクト,通常はDisplayオブジェクトが必要となる。ImageRegistryクラスのコンストラクタ(引数なし版)では,コンストラクタを呼び出した処理のスレッドに紐づくDisplayオブジェクトをDisplay.getCurrent()で取得し,内部に保持している。そして,そのDisplayオブジェクトが破棄されたタイミングで,登録されているImageオブジェクトのdisposeメソッドを呼び出して破棄している。この処理は,DisplayオブジェクトのdisposeExecメソッドにRunnbaleオブジェクトの形でImageRegistryオブジェクトが内部で登録している。
ImageRegistryクラスを使えば,イメージリソースは勝手に破棄される。しかし,やはりイメージリソースの無駄遣いは避けるべきである。ImageRegistryクラスの使用するしないに関わらず,イメージリソースに関しては注意深く扱うべきである。
| 固定リンク
この記事へのコメントは終了しました。
コメント