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
이 정적으로 만들어지지 않았는지 모르지만 애플리케이션을 변경했을 때 응용 프로그램이 너무 많이 웹에 닿지 않아 (데이터 비용 절약/배터리 배수/성능 향상).
코드를 간략하게 살펴 보았지만 올바른 것 같습니다. sHardBitmapCache가 정적 인 것으로 생각되었습니다. 특히 이름이 지정되어 있습니다. – JesusFreke