не осъществява правилен достъп до изображения от кеша в изглед на списък

Изтеглям изображения от сървъра в ListView и ги съхранявам в SD карта.

И когато следващия път се появи listview, имам достъп до него от SD карта само чрез Async метод, използвам този подход, така че всеки потребител да не се нуждае от достъп до сървъра.

Но когато всички изображения се зареждат в изглед на списък от SD карта и ако го превъртя доста бързо, тогава всеки път, когато се опитва да получи достъп до него само от SD картата, а не от кешовете, предполагам.

Сблъсках се със същия проблем, когато изображенията се изтеглят от сървъра, и затова реших да го съхраня в SD карта. но аз съм изправен пред същия проблем.

ето моят код ListImageDownloader. В това има функция, наречена downloadBitmap(String) и създадох друга функция, наречена downloadSDBitmap(String), чийто код е както следва

Bitmap downloadSDBitmap(String urlId) {

         Bitmap bitmap = null;
         File file = new File( 
                 fileLoc +"/"+ urlId+".png");

         if(file.exists()){
             Log.d("PATH" , file.getAbsolutePath());

             bitmap = BitmapFactory.decodeFile(file.getAbsolutePath());
         }

         return bitmap;

}

освен това целият кеширащ код и всички са еднакви. така че може ли някой да ми помогне как мога да го подобря, тъй като в Gtalk приложение за Android, когато превъртам бързо, зарежда изображенията само веднъж, след което, ако превъртя бързо, изображенията остават такива, каквито са и не се извличат от мрежата

Актуализация

това са моите параметри

final static int MAX_ENTRIES = 150;

private static final int HARD_CACHE_CAPACITY =50;
private static final int DELAY_BEFORE_PURGE = 10 * 1000; // in milliseconds

person Hunt    schedule 21.08.2012    source източник


Отговори (1)


Кеширането основно разчита на наличната памет. Ако има останала памет за вашето приложение, ще трябва да приложите добро решение, което кешира вашите растерни изображения.

В миналото беше SoftReference/WeakReference популярен метод за кеширане на растерни изображения (опитах го преди година, можете да прочетете за моя въпрос за това тук). Но в по-късните API на Android събирачът на боклук е станал по-агресивен в събирането им и затова те вече не се препоръчват.

Сега се препоръчва да използвате LRU кеш. Има наличен пример на уебсайта за разработчици на Android.

person Wroclai    schedule 21.08.2012
comment
предполагам, че това изисква да се включи библиотека с пакети за поддръжка на android, което не е необходимо, увеличавайки размера на приложението ми, така че имате ли друго решение? - person Hunt; 22.08.2012
comment
Преди година бях принуден да напиша моя собствена LRU реализация. Проверете приетия отговор на моя въпрос, всичко, което трябва да знаете, е написано там. - person Wroclai; 22.08.2012
comment
Шели, получи ли референтния си код? тъй като се опитвам да интегрирам код, който е предложен във вашия въпрос. Трябва ли да заменя sSoftBitmapCache с предложения код? - person Hunt; 22.08.2012
comment
Всичко е написано тук: stackoverflow.com/a/224886/426429. Ако искате вашият LRU кеш да има функционалност като LruCache в пакета за поддръжка, трябва да го напишете сами. - person Wroclai; 22.08.2012
comment
Опитах кода, предложен във вашия въпрос, като промених меката препратка към LinkedHashMap Сега нещата са там, докато не превъртя изглед на списък, изображенията не се зареждат - person Hunt; 22.08.2012
comment
След това трябва ръчно да извикате метода, който ви дава растерно изображение за конкретния ред. - person Wroclai; 22.08.2012
comment
Добре направена корекция, сега изображенията се зареждат, но резултатът е същият, когато използвах ConcurrentHashMap за мека справка. ето моят код http://pastebin.com/emF4Ztxk, ако можете да проверите. Задействам „imageDownloader.download(data.getTemplateIconUrl(), (ImageView) holder.templateIcon,true);“ в getView, за да извлека изображението - person Hunt; 22.08.2012
comment
Колко голям е вашият кеш? Остана ли памет за още снимки? Обикновено, когато отнеме известно време, за да се появи изображението, проблемът е 99%, защото трябва да презаредите изображенията, следователно вашата реализация на кеширане не работи правилно. Трябва да отстраните грешки в кода си стъпка по стъпка. - person Wroclai; 22.08.2012
comment
Няма много за разказване... Всичко, от което се нуждаете, е налично - не сте искали да използвате библиотеката за поддръжка, което означава, че трябва сами да напишете и манипулирате механизма. Отстранете грешки в кода! - person Wroclai; 22.08.2012
comment
тъкмо изтичам крайния срок, така или иначе, ако използвам библиотека за поддръжка, тогава какви неща трябва да променя, имам предвид пробата на android doc, която изпратихте тук, е малко трудна за интегриране с моя код, така че - person Hunt; 22.08.2012
comment
Статията, свързана в отговора ми, е отлична статия - тя описва всичко, което трябва да знаете. Това е просто, ако има растерно изображение в кеша, вземете го, ако не е, вземете го от интернет или SD картата и го поставете в кеша. Наистина показва всичко. Ако е трудно да се интегрира, трябва да опитате да преработите кода си... - person Wroclai; 22.08.2012
comment
@Hunt: Сега написах демонстрационно приложение. Вижте го тук: shelly-productions.googlecode.com/files/ListViewImageCache.zip - person Wroclai; 24.08.2012
comment
За бъдещи читатели URL адресът вече е: code.google. com/p/shelly-productions/source/browse/ - person Wroclai; 27.08.2012
comment
Отново, за бъдещите читатели връзката вече е dropbox.com/s/pvr9zyl811tfeem/ListViewImageCache. zip. - person Wroclai; 02.08.2014