CacheオブジェクトにはSoftReferenceを
Android、いかがですか。
今日もOut Of Memory、出していますでしょうか。
そんなあなたに朗報です。
少しでもメモリにやさしいプログラムを。
今日はSoftReferenceのお話です。
トレードオフ
Androidで(というよりもJavaで)パフォーマンスに最も影響を与えるのはインスタンス生成の部分ではないでしょうか。
ループの中でインスタンスを生成しようものなら、たちまちあなたのUIは機敏さを失うことになるでしょう。
インスタンス生成はGCの源です。ストップザワールドを少しでも避けるためには極力newなどは控えなければなりません。
となると、インスタンスを作らないことが究極なのですが、全く作らないというわけにはいきません。ならば、一度作ったインスタンスは再利用しようではありませんか。
その時に役に立つのがキャッシュです。一度作ったインスタンスはキャッシュに保持しておいて、また必要になった時には以前作ったものを取り出せばよい。
これだけでインスタンス生成のコストがなくなり、とっても高速化できます!
ただし、大量の画像データをSDカードから取り出そうとした場合はどうでしょうか。
一度はみなさんやるのではないでしょうか。
そう。OutOfMemoryです。
メモリは有限なので、全てのオブジェクトを保持したままだと、いずれメモリ不足に陥りアプリがクラッシュします。
パフォーマンスをとればメモリが不足し、メモリをとればパフォーマンスに影響がでます。最適なバランスポイントを探す必要がありそうです。
SoftReference
そんな時に最適なのがSoftReferenceです。
SoftReference | Android Developers
SoftReferenceを使うと通常のオブジェクトとは異なり、VMがOutOfMemoryになりそうになると優先的にGCされます。
なので、勝手にトレードオフのバランスをとってくれるわけです。
他にWeakReferenceもありますが、これはGCのたびに優先的に解放される参照方法です。優先的に解放したい場合に使えると思います。
他にはPhantomReferenceなんていうのもあります。
なんでしょうかこれは。もはや幻のような参照ですか。怖くて要りませんよ(冗談です)。
SoftReferenceの使い方
インスタンスの参照をSoftReferenceにするには、SoftReferenceオブジェクトでラップしてやります。
以前AsyncTaskでユーザビリティを向上させる | Techfirm Android Labで作成したImageCacheクラスがありますが、これをSoftReferenceなキャッシュクラスにしてみます。
こんな感じです。
とても簡単にできて、とても有効なテクニックだと思うのでぜひためしてみてください。
参考はこちら。
Google I/O – Turbo-charge your UI: How to Make your Android UI Fast and Efficient


2行目は不要
9行目は誤り
ヾ( ゚д゚)ノ” たぶん
[...] していたのですが、TechFirm Android LabさんのブログでSoftReferenceが紹介されていました。 [...]
とてつもなく参考になりました!ずっとOut of Memoryに悩まされていたので、この記事を読んで目から鱗です。ありがとうございました!
お役に立てて何よりです!