このセクションでは、アプリケーション特有の要件を満たす、カスタム・キャッシュ・アルゴリズムを記述する方法について説明します。このセクションで使用する例は、 IlvDefaultTileCache クラス (JViews Maps ライブラリーにあります) の簡易版です。
この例のソース・コード一式は、以下のファイルにあります。
クラス
SimpleTileCache
は、クラス IlvTileCache
を機能拡張します。public class SimpleTileCache extends IlvTileCache {
cacheSize
では、キャッシュに格納可能なタイルの最大数を定義します。// default cache size private int cacheSize = 5; // To Store the tiles transient private Vector tiles = new Vector();
以下のコンストラクターでは、特定のサイズ (この例では 5) のデフォルト・キャッシュのインスタンスを作成します。
public SimpleTileCache(int size) { cacheSize = size; }
以下のコンストラクターでは、提供された入力ストリームからキャッシュを読み込みます。このコンストラクターを使用して作成したキャッシュは IlvPersistentObject インターフェースを実装するため、
IlvTiledLayer
オブジェクトで保存できます。public SimpleTileCache(IlvInputStream stream) throws IlvReadFileException { cacheSize = stream.readInt("size"); }
write()
メソッドでは、出力ストリームにキャッシュを書き込みます。public void write(IlvOutputStream stream) throws IOException { super.write(stream); stream.write("size", cacheSize); }
以下のメソッドは、 IlvTileCache インターフェースに属します。このメソッドは、タイルのキャッシュ時に呼び出されます。この実装では、タイルは内部タイル一覧の末尾に追加されます。
public void tileCached(IlvTile tile) { tiles.addElement(tile); }
以下のメソッドは、 IlvTileCache インターフェースに属します。このメソッドは、タイルをキャッシュから削除し、再びロックすると呼び出されます。この実装では、タイルは内部タイル一覧から削除されます。
public void tileRetrieved(IlvTile tile) { tiles.removeElement(tile); }
以下のメソッドは、 IlvTileCache インターフェースに属します。このメソッドは、タイルのロード直前に呼び出されます。この実装では、キャッシュのタイル数がキャッシュ・サイズを超えた場合に、内部タイル一覧の先頭にある LRU タイルがアンロードされ、新規タイルの領域を確保します。
public void tileAboutToLoad(IlvTile tile) { int toRemove = tiles.size() - cacheSize; if (toRemove <= 0) return; for (int i = toRemove; i > 0; i--) { IlvTile current = (IlvTile) tiles.elementAt(0); tiles.removeElementAt(0); releaseTile(current); } }
以下のメソッドは、 IlvTileCache インターフェースに属します。このメソッドは、タイル・レイヤーをマネージャーから取り出し、タイル・コントローラーが管理するタイルをキャッシュから削除すると呼び出されます。
public void controllerDisposed(IlvTileController controller) { int i = 0; while (i < tiles.size()) { IlvTile tile = (IlvTile) tiles.elementAt(i); if (tile.getController() == controller) tiles.removeElementAt(i); else i++; } }