5

我有一个可以远程加载大量大图像的应用程序。当我使用 nostra 的通用图像加载器 ( https://github.com/nostra13/Android-Universal-Image-Loader ) 时,我经常会遇到内存不足错误。我不知道我应该如何设置图像加载器来防止这种情况。

这是我当前的 ImageLoader 规格:

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

是的,我在调用 displayImage() 时通过了 imgDispOpts。

4

4 回答 4

5

尽量不要在内存中缓存,使用EXACTLY比例类型和RGB_565位图解码。

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

this.imgDispOpts = new DisplayImageOptions.Builder() 
    .cacheOnDisc() 
    .imageScaleType(ImageScaleType.EXACTLY) 
    .bitmapConfig(Bitmap.Config.RGB_565)
    .build();
于 2013-03-20T21:08:25.933 回答
1

我试图减少位图解码器中的位图大小,这对我有用。

在 com.nostra13.universalimageloader.core.decode 包中,打开 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;
}
于 2014-01-23T22:28:37.357 回答
0

试试下面的配置

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

您还可以使用延迟加载图像。https://github.com/thest1/LazyList

基于 Fedor Vlasov 的项目 LazyList 的通用图像加载器。LazyList 的改进版本。

于 2013-03-20T13:05:12.937 回答
0

你可以试试这个,它对我很有效:

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());
于 2015-04-05T14:26:47.670 回答