2013-03-20 5 views
5

Ich habe eine App, die viele große Bilder aus der Ferne lädt. Wenn ich Nostras Universal Image Loader (https://github.com/nostra13/Android-Universal-Image-Loader) benutze, bekomme ich häufig Fehler wegen zu wenig Speicher. Ich weiß nicht, wie ich den Image-Loader einrichten soll, um dies zu verhindern.Android Universal Image Loader - Wie lege ich die Spezifikationen korrekt fest?

Dies ist meine aktuelle Imageloader Spezifikationen:

ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(context) 
     .enableLogging() 
     .memoryCache(new WeakMemoryCache()) 
     .build(); 

this.imgDispOpts = new DisplayImageOptions.Builder() 
     .cacheInMemory() 
     .cacheOnDisc() 
     .imageScaleType(ImageScaleType.IN_SAMPLE_INT) 
     .build(); 

this.imageLoader = ImageLoader.getInstance(); 
this.imageLoader.init(config); 

Und ja, ich imgDispOpts passieren, wenn displayImage() aufrufen.

Antwort

0

die unter Konfiguration Versuche

ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(context) 
    .enableLogging() 
    discCacheExtraOptions(maxImageWidthForDiscCache, maxImageHeightForDiscCache, CompressFormat.PNG, 0); 
    .memoryCache(new WeakMemoryCache()) 
    .build(); 

this.imgDispOpts = new DisplayImageOptions.Builder() 
    .cacheInMemory() 
    .cacheOnDisc() 
    .imageScaleType(ImageScaleType.EXACTLY) 
    .build(); 

Sie können auch faulen Laden von Bildern verwenden. https://github.com/thest1/LazyList.

Universal Image Loader basierend auf Fedor Vlasovs Projekt LazyList. Verbesserte Version von LazyList.

+0

was die Arbeit ist diese Zeile, discCacheExtraOptions (maxImageWidthForDiscCache, maxImageHeightForDiscCache, CompressFormat.PNG, 0); –

+0

zum Zwischenspeichern von Bitmaps mit richtiger Höhe und Breite Einstellung der maximalen Höhe und Breite – Raghunandan

+0

Kann es Auswirkungen auf die Bildqualität haben, wenn wir die statische Höhe und Breite einstellen? –

5

Versuchen Sie nicht, im Speicher zwischenzuspeichern, verwenden Sie EXACTLY Skalentyp und RGB_565 für Bitmap-Decodierung.

1

Ich habe versucht, die Bitmap-Größe im Bitmap-Decoder zu reduzieren, die für mich funktionierte.

Im Paket com.nostra13.universalimageloader.core.decode, offene BaseImageDecoder.java,

public Bitmap decode(ImageDecodingInfo decodingInfo) throws IOException { 
     Bitmap decodedBitmap; 
     ImageFileInfo imageInfo; 

     InputStream imageStream = getImageStream(decodingInfo); 
     try { 
      imageInfo = defineImageSizeAndRotation(imageStream, decodingInfo); 
      imageStream = resetStream(imageStream, decodingInfo); 
      Options decodingOptions = prepareDecodingOptions(imageInfo.imageSize, decodingInfo); 

// add in the decodingOptions here: 

decodingOptions.inSampleSize = 10; // or any number 

// or you can calculate the resample rate by using the screen size/grid size and the image size 

decodedBitmap = BitmapFactory.decodeStream(imageStream, null, decodingOptions); 
    } finally { 
     IoUtils.closeSilently(imageStream); 
    } 
    if (decodedBitmap == null) { 
     L.e(ERROR_CANT_DECODE_IMAGE, decodingInfo.getImageKey()); 
    } else { 
     decodedBitmap = considerExactScaleAndOrientaiton(decodedBitmap, decodingInfo, imageInfo.exif.rotation, imageInfo.exif.flipHorizontal); 
    } 
    return decodedBitmap; 
} 
+0

Es funktionierte. Danke vielmals! Die Ausnahme wegen zu wenig Speicher hat mich verrückt gemacht. – NightFury

0

du versuchen können, ist es für mich gut funktioniert:

ImageLoaderConfiguration.Builder config = new ImageLoaderConfiguration.Builder(context) 
//Add these lines to your ImageLoader configuration 
     .threadPriority(Thread.NORM_PRIORITY - 2); 
     .denyCacheImageMultipleSizesInMemory(); 
     .diskCacheExtraOptions(150, 150, null); // You may change image resolution to fit your needs 


ImageLoader.getInstance().init(config.build());