Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Android Universal Image Loader - how do I set the specs correctly?

I have an app that loads a lot of big images remotely. When I use nostra's Universal Image Loader (https://github.com/nostra13/Android-Universal-Image-Loader) I often get Out Of Memory errors. I don't know how I should set up the imageloader to prevent this.

This is my current ImageLoader specs:

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

And yes, I pass imgDispOpts when calling displayImage().

like image 676
OriginalUtter Avatar asked Mar 20 '13 12:03

OriginalUtter


2 Answers

Try not cache in memory, use EXACTLY scale type and RGB_565 for bitmap decoding.

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

this.imgDispOpts = new DisplayImageOptions.Builder() 
    .cacheOnDisc() 
    .imageScaleType(ImageScaleType.EXACTLY) 
    .bitmapConfig(Bitmap.Config.RGB_565)
    .build();
like image 99
nostra13 Avatar answered Sep 20 '22 14:09

nostra13


I tried to reduce the bitmap size in the bitmap decoder, which worked for me.

In package com.nostra13.universalimageloader.core.decode, open 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;
}
like image 43
user3229813 Avatar answered Sep 19 '22 14:09

user3229813