Universal Image Loader cache -


i'm trying integrate universal image loader android app. has gridview , shows images acquired internet. implemented using arrayadapter loads images in getview() in usual way.

it works in terms of displaying picture correctly. found unexpected behavior in loading images memory cache.

  1. when activity launched, uil loads image internet or disc cache if exists. (of course, expected behavior.)
  2. scrolling down gridview until first column go out screen, , scroll top. in time, images @ first column loaded disc cache, instead of memory cache.
  3. then scrolling down , again. in time, images @ first column loaded memory cache.

i expect images loaded memory cache @ second time of displaying, step 2 in operation above. don't know why disc cache used in case.

here codes.

imageloaderconfiguration

imageloaderconfiguration mimageloaderconfig =         new imageloaderconfiguration.builder(getapplicationcontext())                 .defaultdisplayimageoptions(defaultoptions)                 .enablelogging()                 .build(); 

displayimageoptions

displayimageoptions defaultoptions =         new displayimageoptions.builder()                 .cacheinmemory()                 .cacheondisc()                 .showimageforemptyuri(r.drawable.empty_photo)                 .showstubimage(r.drawable.empty_photo)                 .displayer(new fadeinbitmapdisplayer(500))                 .build(); 

getview() in arrayadapter

if (convertview == null) {     convertview = (framelayout) layoutinflater.from(getcontext())             .inflate(mlayoutid, null);     convertview.setlayoutparams(mimageviewlayoutparams); } else { // otherwise re-use converted view     convertview.findviewbyid(r.id.videoiconinthumbnail).setvisibility(view.gone); }  // check height matches our calculated column width if (convertview.getlayoutparams().height != mitemheight) {     convertview.setlayoutparams(mimageviewlayoutparams); }  imageview image = (imageview) convertview.findviewbyid(r.id.photothumbnail); imageloader.getinstance().displayimage(thumbnailurl, image,         new simpleimageloadinglistener() {              @override             public void onloadingcomplete(string imageuri, view view, bitmap loadedimage) {                 log.v(tag, imageuri + " loaded.");             }         }); return convertview; 

layout xml element in gridview

<?xml version="1.0" encoding="utf-8"?> <framelayout xmlns:android="http://schemas.android.com/apk/res/android"     android:layout_width="match_parent"     android:layout_height="match_parent" >      <imageview         android:id="@+id/photothumbnail"         android:layout_width="match_parent"         android:layout_height="match_parent"         android:scaletype="centercrop" >     </imageview>      <imageview         android:id="@+id/videoiconinthumbnail"         android:layout_width="wrap_content"         android:layout_height="wrap_content"         android:layout_gravity="center"         android:src="@drawable/ic_play"         android:visibility="gone" >     </imageview> </framelayout> 

version of uil 1.8.4. tested android version 4.1.2.

added log output of uil when image loaded 3 times operation described above.

// fist time of displaying i/imageloader( 7404): start display image task [http://xxx/yyy.jpg_1080x1776] i/imageloader( 7404): load image disc cache [http://xxx/yyy.jpg_1080x1776] i/imageloader( 7404): subsample original image (x192) x192 (scale = 1) [http://xxx/yyy.jpg_1080x1776] i/imageloader( 7404): cache image in memory [http://xxx/yyy.jpg_1080x1776] i/imageloader( 7404): display image in imageview [http://xxx/yyy.jpg_1080x1776]  // second time of displaying i/imageloader( 7404): imageloader paused. waiting...  [http://xxx/yyy.jpg_358x357] i/imageloader( 7404): start display image task [http://xxx/yyy.jpg_358x357] i/imageloader( 7404): load image disc cache [http://xxx/yyy.jpg_358x357] i/imageloader( 7404): subsample original image (x192) x192 (scale = 1) [http://xxx/yyy.jpg_358x357] i/imageloader( 7404): cache image in memory [http://xxx/yyy.jpg_358x357] i/imageloader( 7404): display image in imageview [http://xxx/yyy.jpg_358x357]  // third time of displaying i/imageloader( 7404): load image memory cache [http://xxx/yyy.jpg_358x357] 

thank you.

this because of uil's logic.

1) first time (imageloader.displayimage(...)) size of imageview unknown because haven't drawn yet on screen. uil considers size of imageview full screen size, decodes image bitmap of size (1080x1776, considering aspect ratio) , caches bitmap in memory.

2) second time real size of drawn imageview known (which smaller full screen size) , uil search cached bitmap of appropriate size cache contains previous large bitmap large our needs. uil decodes image again smaller bitmap , cache in memory too.

3) following displays uses cached bitmap of needed size.

so feature of uil. recommend use denycacheimagemultiplesizesinmemory() in configuration save memory.


Comments

Popular posts from this blog

java - Jmockit String final length method mocking Issue -

asp.net - Razor Page Hosted on IIS 6 Fails Every Morning -

c++ - wxwidget compiling on windows command prompt -