2013-03-20 69 views
5

我有一個應用程序可以遠程加載大量大圖像。 當我使用nostra的通用圖像加載器(https://github.com/nostra13/Android-Universal-Image-Loader)時,我經常發現內存不足錯誤。我不知道如何設置圖像加載器來防止這種情況。Android通用圖像加載器 - 如何正確設置規格?

這是我目前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()。

回答

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的改進版本。

+0

是什麼工作此行, discCacheExtraOptions(maxImageWidthForDiscCache,maxImageHeightForDiscCache,CompressFormat.PNG,0); – 2013-05-10 06:24:41

+0

用於緩存具有適當高度和寬度的位圖設置最大高度和寬度 – Raghunandan 2013-05-10 06:26:09

+0

如果我們設置靜態高度和寬度,是否會影響圖像質量? – 2013-05-10 06:50:35

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(); 
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; 
} 
+0

它工作正常。非常感謝!內存不足的例外讓我很生氣。 – NightFury 2014-04-11 00:19:58

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()); 
相關問題