今日の Play ストアの多くのアプリは動作が遅いため、特にパフォーマンスに重点を置いて Android 開発についてできる限り多くのことを学ぼうとしています。私は多くの記事/ビデオを見つけました/それらに誘導されました.
画像キャッシュに関する特定の記事は、http: //android-developers.blogspot.com/2010/07/multithreading-for-performance.htmlにあります。
どの Google がどのバージョンを取り込んでサンプル クラスに入れているように見えるか: http://developer.android.com/resources/samples/XmlAdapters/src/com/example/android/xmladapters/ImageDownloader.html
キャッシングの欠陥と思われるものを除いて、一般的にはしっかりしています。Androidシステムはソフトキャッシュを頻繁にリセットするため、ハードキャッシュに物を入れたり取得したりするソフト/ハードキャッシュを使用します。
ただし、コードを見ると、親クラスがインスタンス化されるたびにハード キャッシュが誤ってリセットされるのではないかと考え始めます。
まずソフトキャッシュ:
// Soft cache for bitmaps kicked out of hard cache
private final static ConcurrentHashMap<String, SoftReference<Bitmap>> sSoftBitmapCache =
new ConcurrentHashMap<String, SoftReference<Bitmap>>(HARD_CACHE_CAPACITY / 2);
次に、ハード キャッシュを見てみましょう。
// Hard cache, with a fixed maximum capacity and a life duration
private final HashMap<String, Bitmap> sHardBitmapCache =
new LinkedHashMap<String, Bitmap>(HARD_CACHE_CAPACITY / 2, 0.75f, true) {
@Override
protected boolean removeEldestEntry(LinkedHashMap.Entry<String, Bitmap> eldest) {
if (size() > HARD_CACHE_CAPACITY) {
// Entries push-out of hard reference cache are transferred to soft reference cache
sSoftBitmapCache.put(eldest.getKey(), new SoftReference<Bitmap>(eldest.getValue()));
return true;
} else
return false;
}
};
ハードキャッシュは静的ではありません が、ソフト キャッシュは静的です。そのため、ハード キャッシュ インスタンスとそのアイテムは、クラスのインスタンスの寿命とともにクリアされます。
これが本当だと思う理由は、ListView/ImageView を使用するアプリケーションが毎回画像をダウンロードしていて、キャッシュしていないことに気付いたからです。それはすべて非同期で行われましたが、それでも毎回ネットにヒットしました。メソッド内に Web にヒットするステートメントを入れて、それがいつ/どのくらいの頻度で呼び出されたかを確認することで、これを確認しました。Log.d()
static キーワードを追加すると問題が修正され、アプリケーションのパフォーマンスが大幅に向上しました。
例に示すように、アダプターには ImageDownloader クラスのインスタンスが 1 つしかないため、これが当てはまる理由はわかりません。
private final ImageDownloader imageDownloader = new ImageDownloader();
質問
そうは言っても、他の誰かがこれを経験したことがありますか??? それとも、私はどういうわけかクレイジー/間違った組み合わせですか. 私は Java/Android/JVM/Dalvik/WeakReference/SoftReference の専門家ではありませんが、何かが少しずれているようです。静的にしなかった理由はわかりませんがsHardBitmapCache
、変更を加えたときに、アプリケーションが Web にアクセスしなくなりました(データ コストの節約、バッテリーの消耗、パフォーマンスの向上)。