2013-03-08 36 views
0

我有一些在android中缓存图像的麻烦。我使用AsyncTask从URL下载图像。在下载之前,我会检查缓存中是否已经包含一个带有URL作为关键字的Drawable。如果是,Drawable将从缓存中取出。如何在Android中使图像缓存工作?

下载由ListFragment的自定义ArrayAdapter或另一个Fragment中的onCreateView()触发。

我的问题如下:第一次下载正常。但是,如果我滚动ListFragment,加载了错误的图像。如果我重新加载List或Fragment,则图像将从缓存中取出,ImageView将为空。如果我不使用缓存,图像将正确显示。

这里我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]); 

谢谢您的帮助。

+0

使用421推荐的库之一,不需要重新发明轮子;) – FWeigl 2013-03-08 11:44:51

回答

3

解决方案有很多种方法。 可以按照下面
Link 1

Link 2
Link 3

链接希望我的回答是有帮助的。 :)

+0

感谢您的提示。它现在完美地工作。 – Bernard 2013-03-08 15:03:53