2013-07-01 5 views
0

Ive가이 이상한 오류로 실행됩니다. 일부 이미지는 평소와 같이 캐시되고 일부 이미지는 왜 표시되지 않습니까? 두 이미지가 모두 표시되고 메모리가 잘 캐시되지만 오프라인 일 때 일부는 오류 이미지를 표시합니다.Android Volley - 일부 디스크 캐시 이미지가 표시되지 않습니까?

예를 들어

http://cs4381.vk.me/u73742951/a_58a41ac2.jpg 잘 작동 이 http://upload.wikimedia.org/wikipedia/commons/thumb/d/d7/Android_robot.svg/220px-Android_robot.svg.png 나던 잘 표시하고 memcaching하지만 난이 저장되는 것을 볼 생각 입력해도 응용 프로그램은이 12KB를 가지고 말한대로 두 번째 나던은, 디스크 캐시에서 표시 얻을 작업 ..both

시스템 설정의 캐시

고마워요!

// 편집 나는 Volley의 깨끗한 복사본을 체크 아웃하고 똑같은 작업을 수행합니다. 그것의 definatelly 버그 ... Ive는 그 이미지가 캐시 된 것을 알았지 만, Bitmap cachedBitmap = mCache.getBitmap(cacheKey);은 항상 null을 반환하므로 캐시는 비트 맵을 가지고 있지 않다가 다시 다운로드하기를 계속하고, 오프라인 일 때 이상하게 작동합니다.

+0

나는 발리의 깨끗한 사본을 체크 아웃과 같은 일을한다. 그것의 definatelly 버그 ... – urSus

+0

아니, 난 두 번째 이미지에서 확인 헤더를했지만 어쩌면 그것은 no-cache 이후 svg에서 genereted입니다 – Selvin

+0

이건 어때? http://freesummer.sk/files/201106/thumb/big/images.jpg http://freesummer.sk/files/201106/thumb/big/fs2007_logo.jpg 이것은 실제로 프로젝트에서 가져온 것입니다. – urSus

답변

1

디스크 캐싱을위한 Volley의 기본 동작이 요청하는 요소 (귀하의 경우 이미지)의 HTTP 헤더에 의존하기 때문에 어떤 조회수가 발생하지 않는 이유가 있습니다.

발리 로그를 확인하고 "캐시 유효 기간이 만료되었습니다"라는 메시지가 표시되는지 확인합니다. 즉, 이미지가 캐시되었지만 기본 디스크 캐시와 관련하여 TTL이 만료되었음을 의미합니다.

기본 설정을 사용하려면 이미지에 max-age = ???와 같은 Cache-Control 헤더가 있어야합니다. 여기서 물음표는 다운로드 한 시간으로부터 충분한 초를 나타냅니다.

기본 동작을 변경하려면 확실하지 않지만 코드를 약간 편집해야한다고 생각합니다.

발리 소스의 CacheDispatcher 클래스를 확인하십시오.

희망이 있습니다.

+0

네, 맞아요. – urSus

1

신속하고 더러운 방법 :

private static class NoExpireDiskBasedCache extends DiskBasedCache 
{ 
    public NoExpireDiskBasedCache(File rootDirectory, int maxCacheSizeInBytes) 
    { 
     super(rootDirectory, maxCacheSizeInBytes); 
    } 
    public NoExpireDiskBasedCache(File rootDirectory) 
    { 
     super(rootDirectory); 
    } 
    @Override 
    public synchronized void put(String key, Entry entry) 
    { 
     if (entry != null) 
     { 
      entry.etag = null; 
      entry.softTtl = Long.MAX_VALUE; 
      entry.ttl = Long.MAX_VALUE; 
     } 

     super.put(key, entry); 
    } 
}