6

今日の Play ストアの多くのアプリは動作が遅いため、特にパフォーマンスに重点を置いて Android 開発についてできる限り多くのことを学ぼうとしています。私は多くの記事/ビデオを見つけました/それらに誘導されました.

画像キャッシュに関する特定の記事は、http: //android-developers.blogspot.com/2010/07/multithreading-for-performance.htmlにあります。

著者は、http ://code.google.com/p/android-imagedownloader/source/browse/trunk/src/com/example/android/imagedownloader/ImageDownloader.java で利用可能なコードを持っています。

どの 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 にアクセスしなくなりました(データ コストの節約、バッテリーの消耗、パフォーマンスの向上)

4

1 に答える 1

2

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

Android ソース ツリーのコードを修正しました。このフィードバックをお寄せいただきありがとうございます。

于 2012-04-18T23:56:49.357 に答える