2013-03-08 4 views
0

나는 안드로이드에서 이미지 캐싱에 몇 가지 문제가 있습니다. AsyncTask가있는 URL에서 이미지를 다운로드하고 있습니다. 다운로드하기 전에 캐시에 URL로 키가있는 Drawable이 이미 있는지 확인합니다. '예'인 경우 드로어 블은 캐시에서 가져옵니다.Android에서 이미지 캐시를 만들려면 어떻게해야합니까?

다운로드는 ListFragment에 대한 사용자 정의 ArrayAdapter 또는 다른 Fragment의 onCreateView()에서 트리거됩니다.

내 문제는 다음과 같습니다. 첫 번째 다운로드가 제대로 작동합니다. 그러나 ListFragment 스크롤하면 잘못된 이미지가로드됩니다. List 또는 Fragment를 다시로드하면 이미지가 캐시에서 가져오고 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]); 

당신의 도움에 감사드립니다.

+0

421이 추천 한 라이브러리 중 하나를 사용하여 바퀴를 재발 명할 필요가 없음;) – FWeigl

답변

3

솔루션에는 여러 가지 방법이 있습니다. 당신은
Link 1

Link 2
Link 3

아래 링크를 따라 수 있기를 바랍니다 내 대답은 helpfull이다. :)

+0

힌트를 보내 주셔서 감사합니다. 이제는 완벽하게 작동합니다. – Bernard

관련 문제