0

Androidで画像をキャッシュする際に問題があります。AsyncTask を使用して URL から画像をダウンロードしています。ダウンロードの前に、URL をキーとする Drawable がキャッシュに既に含まれているかどうかを確認します。はいの場合、Drawable はキャッシュから取得されます。

ダウンロードは、ListFragment のカスタム ArrayAdapter または別の Fragment の onCreateView() によってトリガーされます。

私の問題は次のとおりです。最初のダウンロードは正しく機能します。しかし、ListFragment をスクロールすると、間違った画像が読み込まれます。リストまたはフラグメントをリロードすると、イメージはキャッシュから取得され、ImageViews は空になります。キャッシュを使用しない場合、画像は正しく表示されます。

ここに私の CacheHandler のコード:

import android.graphics.drawable.Drawable;
import android.util.LruCache;

public class CacheHandler {
    private static CacheHandler instance;
    private LruCache<String, Drawable> cache;
    private final Logger logger = new Logger(CacheHandler.class);

    private CacheHandler() {
        final int maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024);
        final int cacheSize = maxMemory / 8;
        cache = new LruCache<String, Drawable>(cacheSize);
    }

    public static CacheHandler getInstance() {
        if (instance == null)
            instance = new CacheHandler();
        return instance;
    }

    public void addToCache(String key, Drawable pic) {
        if (getFromCache(key) == null) {
            cache.put(key, pic);
            logger.debug("Added drawable to cache with key " + key);
        } else
            logger.debug("Drawable with key " + key + " already exists");
    }

    public Drawable getFromCache(String key) {
        logger.debug("Getting image for " + key);
        Drawable d = cache.get(key);
        logger.debug("Image is " + d);
        return d;
    }
}

AsyncTask での呼び出しは次のとおりです。

logger.debug("Checking cache");
Drawable d = CacheHandler.getInstance().getFromCache((String) params[0]);

ご協力ありがとうございました。

4

1 に答える 1

3

ソリューションには多くの方法があります。リンク 1の下のリンクをたどることができます

リンク 2
リンク 3

私の答えが役に立てば幸いです。:)

于 2013-03-08T11:31:35.373 に答える