5

Я использую UIL для загрузки удаленных изображений и заполнения фрагментов в FragmentStatePagerAdapter. Я прочитал readme и обычные ошибки, но я не могу решить эту ошибку.Универсальный загрузчик изображений UIL nostra ошибка памяти

Вот конфиг:

ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(getApplicationContext()) 
    .threadPoolSize(1) 
    .build(); 
    ImageLoader.getInstance().init(config); 

Вот где я показывать мои изображения:

public View onCreateView(LayoutInflater inflater, ViewGroup container, 
     Bundle savedInstanceState) { 


    ImageLoader imgLoader = ImageLoader.getInstance(); 

    DisplayImageOptions options = new DisplayImageOptions.Builder() 
    .showStubImage(R.drawable.loading) 
    .cacheOnDisc() 
    .resetViewBeforeLoading() 
    .bitmapConfig(Bitmap.Config.RGB_565) 
    .imageScaleType(ImageScaleType.IN_SAMPLE_INT) 
    .build(); 

    imgLoader.displayImage(this.contentImage, this.imgView, options); 

    return layout; 
} 

А вот где я уничтожу мои фрагменты в адаптере:

public void destroyItem(ViewGroup container, int position, Object object) { 
    if (position >= getCount()) { 
     container.removeAllViews(); 
     FragmentManager manager = ((Fragment) object).getFragmentManager(); 
     FragmentTransaction trans = manager.beginTransaction(); 
     trans.remove((Fragment) object); 
     trans.commit(); 
    } 
} 

и, наконец, я вижу исключение:

{ 
06-20 12:09:24.877: E/dalvikvm-heap(17043): Out of memory on a 6345504-byte allocation. 
06-20 12:09:24.877: I/dalvikvm(17043): "pool-1-thread-1" prio=4 tid=16 RUNNABLE 
06-20 12:09:24.877: I/dalvikvm(17043): | group="main" sCount=0 dsCount=0 obj=0x42593a48 self=0x6367e778 
06-20 12:09:24.887: I/dalvikvm(17043): | sysTid=17091 nice=10 sched=0/0 cgrp=apps/bg_non_interactive handle=1667639656 
06-20 12:09:24.887: I/dalvikvm(17043): | state=R schedstat=(4021618000 2254117000 18267) utm=341 stm=61 core=0 
06-20 12:09:24.887: I/dalvikvm(17043): #00 pc 00074350 /system/lib/libdvm.so (dvmDumpNativeStack(DebugOutputTarget const*, int)+35) 
06-20 12:09:24.887: I/dalvikvm(17043): #01 pc 00062afe /system/lib/libdvm.so (dvmDumpThreadEx(DebugOutputTarget const*, Thread*, bool)+557) 
06-20 12:09:24.887: I/dalvikvm(17043): #02 pc 00062bae /system/lib/libdvm.so (dvmDumpThread(Thread*, bool)+25) 
06-20 12:09:24.887: I/dalvikvm(17043): #03 pc 000298ec /system/lib/libdvm.so (dvmMalloc(unsigned int, int)+584) 
06-20 12:09:24.887: I/dalvikvm(17043): #04 pc 0007fdfe /system/lib/libdvm.so (dvmAllocPrimitiveArray(char, unsigned int, int)+93) 
06-20 12:09:24.887: I/dalvikvm(17043): #05 pc 0005357e /system/lib/libdvm.so 
06-20 12:09:24.887: I/dalvikvm(17043): #06 pc 000798e0 /system/lib/libandroid_runtime.so (GraphicsJNI::allocateJavaPixelRef(_JNIEnv*, SkBitmap*, SkColorTable*)+67) 
06-20 12:09:24.887: I/dalvikvm(17043): #07 pc 000799ae /system/lib/libandroid_runtime.so (JavaPixelAllocator::allocPixelRef(SkBitmap*, SkColorTable*)+45) 
06-20 12:09:24.887: I/dalvikvm(17043): #08 pc 0004aa18 /system/lib/libskia.so (SkBitmap::allocPixels(SkBitmap::Allocator*, SkColorTable*)+56) 
06-20 12:09:24.887: I/dalvikvm(17043): #09 pc 000cd848 /system/lib/libskia.so (SkPNGImageDecoder::onDecode(SkStream*, SkBitmap*, SkImageDecoder::Mode)+404) 
06-20 12:09:24.887: I/dalvikvm(17043): #10 pc 000c9504 /system/lib/libskia.so (SkImageDecoder::decode(SkStream*, SkBitmap*, SkBitmap::Config, SkImageDecoder::Mode, bool)+168) 
06-20 12:09:24.887: I/dalvikvm(17043): #11 pc 00075a08 /system/lib/libandroid_runtime.so 
06-20 12:09:24.887: I/dalvikvm(17043): #12 pc 000762ac /system/lib/libandroid_runtime.so 
06-20 12:09:24.887: I/dalvikvm(17043): #13 pc 0001dd8c /system/lib/libdvm.so (dvmPlatformInvoke+112) 
06-20 12:09:24.887: I/dalvikvm(17043): #14 pc 0005a6e2 /system/lib/libdvm.so (dvmCallJNIMethod(unsigned int const*, JValue*, Method const*, Thread*)+165) 
06-20 12:09:24.887: I/dalvikvm(17043): #15 pc 000271a0 /system/lib/libdvm.so 
06-20 12:09:24.887: I/dalvikvm(17043): #16 pc 0002b898 /system/lib/libdvm.so (dvmInterpret(Thread*, Method const*, JValue*)+184) 
06-20 12:09:24.887: I/dalvikvm(17043): #17 pc 00073d2c /system/lib/libdvm.so (dvmCallMethodV(Thread*, Method const*, Object*, bool, JValue*, std::__va_list)+563) 
06-20 12:09:24.887: I/dalvikvm(17043): #18 pc 00073e04 /system/lib/libdvm.so (dvmCallMethod(Thread*, Method const*, Object*, JValue*, ...)+19) 
06-20 12:09:24.887: I/dalvikvm(17043): #19 pc 000640f4 /system/lib/libdvm.so 
06-20 12:09:24.887: I/dalvikvm(17043): #20 pc 0000dcfc /system/lib/libc.so (__thread_entry+124) 
06-20 12:09:24.887: I/dalvikvm(17043): #21 pc 0000d8d0 /system/lib/libc.so (pthread_create+172) 
06-20 12:09:24.887: I/dalvikvm(17043): at android.graphics.BitmapFactory.nativeDecodeStream(Native Method) 
06-20 12:09:24.887: I/dalvikvm(17043): at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:529) 
06-20 12:09:24.887: I/dalvikvm(17043): at com.nostra13.universalimageloader.core.ImageDecoder.decode(ImageDecoder.java:82) 
06-20 12:09:24.887: I/dalvikvm(17043): at com.nostra13.universalimageloader.core.LoadAndDisplayImageTask.decodeImage(LoadAndDisplayImageTask.java:270) 
06-20 12:09:24.887: I/dalvikvm(17043): at com.nostra13.universalimageloader.core.LoadAndDisplayImageTask.tryLoadBitmap(LoadAndDisplayImageTask.java:244) 
06-20 12:09:24.887: I/dalvikvm(17043): at com.nostra13.universalimageloader.core.LoadAndDisplayImageTask.run(LoadAndDisplayImageTask.java:149) 
06-20 12:09:24.887: I/dalvikvm(17043): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080) 
06-20 12:09:24.887: I/dalvikvm(17043): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573) 
06-20 12:09:24.887: I/dalvikvm(17043): at java.lang.Thread.run(Thread.java:856) 
06-20 12:09:24.897: D/skia(17043): --- decoder->decode returned false 
06-20 12:09:24.897: E/ImageLoader(17043): null 
06-20 12:09:24.897: E/ImageLoader(17043): java.lang.OutOfMemoryError 
06-20 12:09:24.897: E/ImageLoader(17043): at android.graphics.BitmapFactory.nativeDecodeStream(Native Method) 
06-20 12:09:24.897: E/ImageLoader(17043): at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:529) 
06-20 12:09:24.897: E/ImageLoader(17043): at com.nostra13.universalimageloader.core.ImageDecoder.decode(ImageDecoder.java:82) 
06-20 12:09:24.897: E/ImageLoader(17043): at com.nostra13.universalimageloader.core.LoadAndDisplayImageTask.decodeImage(LoadAndDisplayImageTask.java:270) 
06-20 12:09:24.897: E/ImageLoader(17043): at com.nostra13.universalimageloader.core.LoadAndDisplayImageTask.tryLoadBitmap(LoadAndDisplayImageTask.java:244) 
06-20 12:09:24.897: E/ImageLoader(17043): at com.nostra13.universalimageloader.core.LoadAndDisplayImageTask.run(LoadAndDisplayImageTask.java:149) 
06-20 12:09:24.897: E/ImageLoader(17043): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080) 
06-20 12:09:24.897: E/ImageLoader(17043): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573) 
06-20 12:09:24.897: E/ImageLoader(17043): at java.lang.Thread.run(Thread.java:856) 
} 

Я понятия не имею, как его решить. Загруженные изображения изменяются по размеру. Они могут варьироваться от 500 КБ до 1,5 МБ.

+0

проверить это может помочь http://stackoverflow.com/questions/16789676/caching-images-and-displaying/16978285#16978285 – Raghunandan

ответ

4

РЕШИТЬ:

Это wasnt't в ИЮОЖЕ проблемы , Проблема была связана с адаптером страницы.Растровые изображения во Фрагментах не были надлежащим образом обработаны GC, и была некоторая косвенная ссылка, сохраняющая их. Освобождение битмапов явно решило проблему.

EDIT:

Это не правильный УИЛ проблема. Я работал с библиотекой SupportFragment, и это может быть неправильно настроено. Трюк для меня был вручную выпущен каждый растровый рисунок, который не был на экране, но проблему следует рассматривать по-другому. Это приложение использует очень большое количество WebViews, которые, на мой взгляд, являются злыми из-за того, что их потребление памяти просто глупо! Добавление UIL с помощью изображений hi-res делает мое приложение для OOM из-за сочетания этих факторов.

Это немного эмпирическое решение, но оно действительно работает.

+13

вы можете поделиться своим решением? – eshbeata

+0

Сообщите свое решение! – AndyB

2

У меня есть следующая конфигурация с disk cache. Я никогда не сталкивался с проблемой OOM.

ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(
      YourActivity.this).threadPoolSize(5) 
      .threadPriority(Thread.MIN_PRIORITY + 3) 
      .denyCacheImageMultipleSizesInMemory() 
      // .memoryCache(new UsingFreqLimitedMemoryCache(2000000)) // You 
      // can pass your own memory cache implementation 
      .memoryCacheSize(1048576 * 10) 
      // 1MB=1048576 *declare 20 or more size if images are more than 
      // 200 
      .discCache(new UnlimitedDiscCache(cacheDir)) 
      // You can pass your own disc cache implementation 
      // .defaultDisplayImageOptions(DisplayImageOptions.createSimple()) 
      .build(); 

Для создания cache dir,

File cacheDir = new File(this.getCacheDir(), "imgcachedir"); 
    if (!cacheDir.exists()) 
     cacheDir.mkdir(); 
+0

не работает для меня ... :( –

12

https://github.com/nostra13/Android-Universal-Image-Loader.

Из приведенной выше ссылки

Если вы часто получаете OutOfMemoryError в вашем приложении с помощью универсального загрузчика изображения попробуйте следующими (все из них или несколько):

  1. Уменьшить размер пула потоков в конфигурации (. threadPoolSize (...)). Рекомендуется 1 - 5.

  2. Использовать .bitmapConfig(Bitmap.Config.RGB_565) в вариантах отображения. Растровые изображения в RGB_565 потребляют в 2 раза меньше памяти, чем в ARGB_8888.

  3. Используйте .memoryCache(new WeakMemoryCache()) в конфигурации или отключите кэширование в памяти вообще в параметрах отображения (не вызывайте .cacheInMemory()).

  4. Использовать .imageScaleType(ImageScaleType.IN_SAMPLE_INT) в вариантах отображения. Попробуйте .imageScaleType(ImageScaleType.EXACTLY).

  5. Избегайте использования RoundedBitmapDisplayer. Он создает новый объект Bitmap с конфигурацией ARGB_8888 для отображения во время работы.

Пример: Изменение c.ode в ссылке ниже, торчащей на вышеуказанные пункты, чтобы избежать ООМ

Caching images and displaying

+2

все пробовали, если вы прочитали мой вопрос, вы видите. –

+0

хорошо, что говорит документ. Если изображение слишком велико, вы можете столкнуться с утечками памяти, поэтому другой вариант - уменьшить масштаб изображения – Raghunandan

+0

http://stackoverflow.com/questions/15741947/android-universal -имя-loader-resize-picture-before-moving-it-in-a-view. Проверьте ответ, мой самый Nostra. Возможно, это поможет. – Raghunandan

Смежные вопросы