2012-04-13 2 views
6

Play 스토어에있는 많은 앱이 오늘 부진하기 때문에 성능에 중점을 두어 Android 개발에 대해 가능한 한 많이 배우려고 노력했습니다. 나는 많은 기사/비디오를 찾았습니다.안드로이드 ImageDownloader 클래스에서 가능한 버그 : sHardBitmapCache 언제 정적이어야합니까?

이미지 캐싱에 대한 하나 개의 특정 문서에 있습니다 : http://android-developers.blogspot.com/2010/07/multithreading-for-performance.html

저자에 코드 만 사용할 수 있습니다 http://developer.android.com/resources/samples/XmlAdapters/src/com/example/android/xmladapters/ImageDownloader.html

: 구글로의 버전을 듯 그들의 샘플 클래스에 넣어 http://code.google.com/p/android-imagedownloader/source/browse/trunk/src/com/example/android/imagedownloader/ImageDownloader.java

일반적으로 캐싱의 결함이라고 생각되는 것을 제외하고는 견고합니다. 그것은 안드로이드 시스템이 소프트 캐시를 꽤 자주 재설정하기 때문에 하드 캐시에 물건을 넣거나 가져 오는 소프트/하드 캐시를 사용합니다.

그러나 코드를 살펴보면 하드 캐시가 실수로 부모 클래스가 인스턴스화 될 때마다 재설정되는지 궁금해하기 시작합니다. 소프트 캐시가있는 동안, 하드 캐시

// 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; 
     } 
    }; 

입니다

하지 정적 :

먼저 부드러운 캐시 :

// 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); 

지금 하드 캐쉬를 살펴 공전. 따라서 하드 캐시 인스턴스와 아이템은 클래스 인스턴스의 수명으로 지워집니다.

이것이 사실이라고 생각하는 이유는 내가 ListView/ImageView를 사용하는 응용 프로그램을 발견 할 때마다 이미지를 다운로드하고 캐싱하지 않기 때문입니다. 그것은 모두 비동기 적으로 완료되었지만 매회 항상 그물에 부딪쳤다. 나는 을 확인했습니다.이 방법은 웹을 조회하고 언제/얼마나 자주 호출되는지를 내 방법에 넣는 것으로 Log.d() 문을 넣음으로써 이루어집니다.

static 키워드를 추가하면 문제가 해결되고 내 응용 프로그램은 훨씬 더 효율적입니다.

private final ImageDownloader imageDownloader = new ImageDownloader(); 

질문

으로 :

나는 예와 같이 내 어댑터에서 ImageDownloader 클래스의 인스턴스가 하나 같이이 사건이 왜 확실하지 않다 그 모두가 말했듯이,이 경험이있는 다른 사람이 있습니까 ??? 또는 나는 어떻게 든 미친/잘못된 조합입니다. 나는 자바/안드로이드/JVM/Dalvik/WeakReference/SoftReference 전문가가 아니지만 뭔가가 약간 벗어난 것 같습니다. 왜 sHardBitmapCache이 정적으로 만들어지지 않았는지 모르지만 애플리케이션을 변경했을 때 응용 프로그램이 너무 많이 웹에 닿지 않아 (데이터 비용 절약/배터리 배수/성능 향상).

+1

코드를 간략하게 살펴 보았지만 올바른 것 같습니다. sHardBitmapCache가 정적 인 것으로 생각되었습니다. 특히 이름이 지정되어 있습니다. – JesusFreke

답변

2

정확합니다.이 부분은 오타입니다.

나는 안드로이드 소스 트리에 코드를 수정했다. 이 피드백에 감사드립니다.

+0

문제 없습니다. 원래 코드가 여러 번 GitHub에 분기/복사되었음을 알았습니다. 너무 많은 문제가 아니라면 커뮤니티가 변경 사항을 인식 할 수 있도록 블로그 게시물을 업데이트하는 것이 현명 할 것입니다. –

관련 문제