私はPlayストアの多くのアプリが今日低迷しているため、パフォーマンスに特に重点を置いてAndroid開発についてできるだけ多くのことを学ぼうとしています。私は多くの記事/ビデオに出会ったことがあります。Android ImageDownloaderクラスで可能なバグ:sHardBitmapCacheは静的ではありませんか?
画像キャッシュに関する一つの特定の物品は、次のとおりです。http://android-developers.blogspot.com/2010/07/multithreading-for-performance.html
著者で利用可能なコードを持っていますhttp://developer.android.com/resources/samples/XmlAdapters/src/com/example/android/xmladapters/ImageDownloader.html
:Googleはにのバージョンを取るように見えたし、で彼らのサンプルクラスに入れ http://code.google.com/p/android-imagedownloader/source/browse/trunk/src/com/example/android/imagedownloader/ImageDownloader.java
一般的に、私はキャッシングの欠陥であると思われるものを除いて堅実です。これは、Androidシステムがソフトキャッシュをかなり頻繁にリセットするため、ハードキャッシュに物事を入れたり取得したりするソフト/ハードキャッシュを使用します。
しかし、コードを見ると、親クラスがインスタンス化されるたびにハード・キャッシュが誤ってリセットされるかどうか疑問に思うようになります。ソフトキャッシュがある一方で、ハードキャッシュが
// 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;
}
};
ある
ない 静的:まずソフトキャッシュ:
// 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);
は今、ハードキャッシュを見てみましょう静的。したがって、ハード・キャッシュ・インスタンスとアイテムはクラスのインスタンスの寿命とともにクリアされます。
私はこれが本当だと思う理由は、私がListView/ImageViewで自分のアプリケーションに気づいたときに、毎回イメージをダウンロードしていて、キャッシュしないということです。それはすべて非同期的に行われましたが、毎回ネットに突っ込んでいました。私はを確認しましたこれは私の方法の中にLog.d()
というステートメントを入れて、ウェブにヒットし、いつ/どのくらい頻繁に呼び出されたかを見ています。
静的キーワードを追加すると問題が解決され、私のアプリケーションはより効果的です。
private final ImageDownloader imageDownloader = new ImageDownloader();
QUESTION
付:
私は例のように私のアダプタでImageDownloaderクラスのインスタンスが1つだけあり、これはケースである理由を確認していませんすべてのことが言った、誰かがこれを経験している???または私は何とかクレイジー/間違った組み合わせです。私はJava/Android/JVM/Dalvik/WeakReference/SoftReferenceのエキスパートではありませんが、何か少しばかり思われます。なぜsHardBitmapCache
が静的になっていないのか分かりませんが、私がアプリケーションを変更したときにアプリケーションが停止してしまいました。(データコストとバッテリーの節約とパフォーマンスの向上)
私はコードを少しだけ見ましたが、あなたが正しいと思われます - 私はsHardBitmapCacheが静的に意図されていると思われました。 – JesusFreke