2013-03-20 13 views
5

Mam aplikację, która ładuje dużo dużych zdjęć zdalnie. Kiedy używam programu Universal Image Loader firmy nostra (https://github.com/nostra13/Android-Universal-Image-Loader), często występują błędy braku pamięci. Nie wiem, jak powinienem ustawić imageloader, aby temu zapobiec.Android Universal Image Loader - jak ustawić specyfikację poprawnie?

To moje aktualne specyfikacje 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); 

I tak, mijam imgDispOpts Dzwoniąc displayImage().

Odpowiedz

0

Spróbuj poniższej konfiguracji

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

Można również użyć Lazy ładowanie obrazów. https://github.com/thest1/LazyList.

Uniwersalny program ładujący obrazy oparty na projekcie LazyList Fedora Vlasova. Ulepszona wersja LazyList.

+0

co jest dziełem ta linia, discCacheExtraOptions (maxImageWidthForDiscCache, maxImageHeightForDiscCache, CompressFormat.PNG, 0); –

+0

do buforowania bitmap z odpowiednią wysokością i szerokością ustawienia maksymalnej wysokości i szerokości – Raghunandan

+0

Czy może to mieć wpływ na jakość obrazu, jeśli ustawimy wysokość i szerokość statyczną? –

5

Nie próbuj pamięci podręcznej w pamięci, użyj skali skali EXACTLY i RGB_565 do dekodowania bitmap.

1

Próbowałem zmniejszyć rozmiar bitmapy w dekoderze bitmap, który działał dla mnie.

w opakowaniu com.nostra13.universalimageloader.core.decode, otwartej 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

To zadziałało. Wielkie dzięki! Wyjątek z pamięci doprowadził mnie do szału. – NightFury

0

Możesz spróbować, to działa dobrze dla mnie:

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()); 
Powiązane problemy