2012-04-13 4 views
6

私は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が静的​​になっていないのか分かりませんが、私がアプリケーションを変更したときにアプリケーションが停止してしまいました。(データコストとバッテリーの節約とパフォーマンスの向上)

+1

私はコードを少しだけ見ましたが、あなたが正しいと思われます - 私はsHardBitmapCacheが静的に意図されていると思われました。 – JesusFreke

答えて

2

あなたは正しいです、これは私の部分のタイプミスです。

私はアンドロイドソースツリーにコードを修正しました。このフィードバックをありがとう。

+0

問題ありません。私は元のコードが何度もGitHubにフォーク/コピーされていることに気付きました。それほど問題がなければ、おそらくブログ記事の更新が賢明であり、コミュニティはその変更を認識することができます。 –

関連する問題