トップAndroid Java > キャッシュを使用する

キャッシュを使用する

はじめに

地図アプリを自作して2年になるが、これまでは、Androidアプリのキャッシュを意識したことがない。 現在の地図アプリMap(プロジェクト名map3)を確認すると内部ストレージは アプリ 13.34MB、ユーザーデータ 24.58KB、キャッシュ 3.71MB となっていた。

コード上は意識していないが、どこかでキャッシュが使われているようである。他のアプリを調べると、キャッシュサイズはもっと大きい。

記事[1]とは無関係に地図記号(ビットマップ)はHashMapに格納している。コード上、ディスクキャッシュに当たるものはない。 記事[1]にあるようなメモリキャッシュ、ディスクキャッシュを積極的に使えば、 パフォーマンス向上あるいはプログラムのスリム化が図れるかもしれない。

メモリキャッシュ

LruCacheクラスは参照したオブジェクトを LinkedHashMapで保持し、キャッシュが指定のサイズを超える前に、最も長い間使用されていないメンバーを削除する。

地図アプリの場合、全てのアイコンをメモリに常駐できるため、LruCacheの使用によってパフォーマンス向上やプログラムのスリム化は期待できない。

レンダリング用データ(Block)については LruCacheが使えるかも知れない。しかし、使用中のものは破棄できないため、 LruCache ではなく、LinkedHashMapを直接使い、参照カウンタが正のものは破棄しないようにする必要がある。

レンダリングまたはダウンロード済みのビットマップ画像のキャッシュは現在は配列でサイクリックバッファを実現している。 LRU ではなく FIFO 方式である。しかし、配列で状態の管理も行っているため、LruCacheに置き換えるのは難しいかも知れない。

ディスクキャッシュ

現在、何がキャッシュ 3.71MB に置かれているのか想像がつかない。 ネットからダウンロードしたビットマップタイル地図画像が置かれているのかも知れない。 ひょつとしたら、SDカードから読み込んだ画像ファイルも一時的に内部ストレージにキャッシュされるのかも知れない。

キャッシュをクリアすると、0 から 16.38KB には増えたが、短時間操作では、大きくならないので、 タイル画像がキャッシュされるわけではないようだ。

レンダリング用データ(数GB)はスマホの場合SDカードに置いている。 アクセス頻度の高いデータは内部ストレージにキャッシュした方がパフォーマンスは多少向上するであろう。 しかし、効果はほんの少しであろう。また、タブレットの場合、内部ストレージに置いている。

リファレンス

[1] ビットマップのキャッシュ保存