Ошибка OutOFMemory в библиотеке залпа

Это то, что я делаю. Во-первых, в конструкторе Customadapter я инициализирую кеш изображений и загрузчик изображений.

imageCache = new BitmapLruCache();
mImageLoader =  new ImageLoader(newRequestQueue(context), imageCache);

затем в метод getView(), который я сделал...

String url = imgs[position];
image.setImageUrl(url, mImageLoader);
image.setDefaultImageResId(R.drawable.no_image);
image.setErrorImageResId(R.drawable.error_image);

Где imgs — массив URL-адресов растровых изображений, а изображение — объект NetworkImageView. Когда я его выполняю, я получаю ошибку OutOfMemory. Это мой логарифмический о/п: -

    02-24 12:08:08.845: E/dalvikvm-heap(6288): Out of memory on a 144636048-byte allocation.
02-24 12:08:08.845: I/dalvikvm(6288): "main" prio=5 tid=1 RUNNABLE
02-24 12:08:08.845: I/dalvikvm(6288):   | group="main" sCount=0 dsCount=0 obj=0x41767b50 self=0x417571d0
02-24 12:08:08.845: I/dalvikvm(6288):   | sysTid=6288 nice=0 sched=0/0 cgrp=apps handle=1075191004
02-24 12:08:08.845: I/dalvikvm(6288):   | state=R schedstat=( 0 0 0 ) utm=116 stm=35 core=1
02-24 12:08:08.845: I/dalvikvm(6288):   at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method)
02-24 12:08:08.855: I/dalvikvm(6288):   at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:502)
02-24 12:08:08.855: I/dalvikvm(6288):   at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:355)
02-24 12:08:08.855: I/dalvikvm(6288):   at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:815)
02-24 12:08:08.855: I/dalvikvm(6288):   at android.content.res.Resources.loadDrawable(Resources.java:1992)
02-24 12:08:08.855: I/dalvikvm(6288):   at android.content.res.Resources.getDrawable(Resources.java:666)
02-24 12:08:08.855: I/dalvikvm(6288):   at android.widget.ImageView.resolveUri(ImageView.java:616)
02-24 12:08:08.855: I/dalvikvm(6288):   at android.widget.ImageView.setImageResource(ImageView.java:349)
02-24 12:08:08.855: I/dalvikvm(6288):   at com.android.volley.toolbox.NetworkImageView$1.onResponse(NetworkImageView.java:177)
02-24 12:08:08.855: I/dalvikvm(6288):   at com.android.volley.toolbox.NetworkImageView$1$1.run(NetworkImageView.java:168)
02-24 12:08:08.855: I/dalvikvm(6288):   at android.os.Handler.handleCallback(Handler.java:725)
02-24 12:08:08.855: I/dalvikvm(6288):   at android.os.Handler.dispatchMessage(Handler.java:92)
02-24 12:08:08.855: I/dalvikvm(6288):   at android.os.Looper.loop(Looper.java:137)
02-24 12:08:08.855: I/dalvikvm(6288):   at android.app.ActivityThread.main(ActivityThread.java:5099)
02-24 12:08:08.855: I/dalvikvm(6288):   at java.lang.reflect.Method.invokeNative(Native Method)
02-24 12:08:08.865: I/dalvikvm(6288):   at java.lang.reflect.Method.invoke(Method.java:511)
02-24 12:08:08.865: I/dalvikvm(6288):   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:803)
02-24 12:08:08.865: I/dalvikvm(6288):   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:570)
02-24 12:08:08.865: I/dalvikvm(6288):   at dalvik.system.NativeStart.main(Native Method)
02-24 12:08:08.865: D/skia(6288): --- decoder->decode returned false
02-24 12:08:08.865: D/AndroidRuntime(6288): Shutting down VM
02-24 12:08:08.865: W/dalvikvm(6288): threadid=1: thread exiting with uncaught exception (group=0x41766ae0)
02-24 12:08:08.875: E/AndroidRuntime(6288): FATAL EXCEPTION: main
02-24 12:08:08.875: E/AndroidRuntime(6288): java.lang.OutOfMemoryError
02-24 12:08:08.875: E/AndroidRuntime(6288):     at android.graphics.BitmapFactory.nativeDecodeAsset(Native Method)
02-24 12:08:08.875: E/AndroidRuntime(6288):     at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:502)
02-24 12:08:08.875: E/AndroidRuntime(6288):     at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:355)
02-24 12:08:08.875: E/AndroidRuntime(6288):     at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:815)
02-24 12:08:08.875: E/AndroidRuntime(6288):     at android.content.res.Resources.loadDrawable(Resources.java:1992)
02-24 12:08:08.875: E/AndroidRuntime(6288):     at android.content.res.Resources.getDrawable(Resources.java:666)
02-24 12:08:08.875: E/AndroidRuntime(6288):     at android.widget.ImageView.resolveUri(ImageView.java:616)
02-24 12:08:08.875: E/AndroidRuntime(6288):     at android.widget.ImageView.setImageResource(ImageView.java:349)
02-24 12:08:08.875: E/AndroidRuntime(6288):     at com.android.volley.toolbox.NetworkImageView$1.onResponse(NetworkImageView.java:177)
02-24 12:08:08.875: E/AndroidRuntime(6288):     at com.android.volley.toolbox.NetworkImageView$1$1.run(NetworkImageView.java:168)
02-24 12:08:08.875: E/AndroidRuntime(6288):     at android.os.Handler.handleCallback(Handler.java:725)
02-24 12:08:08.875: E/AndroidRuntime(6288):     at android.os.Handler.dispatchMessage(Handler.java:92)
02-24 12:08:08.875: E/AndroidRuntime(6288):     at android.os.Looper.loop(Looper.java:137)
02-24 12:08:08.875: E/AndroidRuntime(6288):     at android.app.ActivityThread.main(ActivityThread.java:5099)
02-24 12:08:08.875: E/AndroidRuntime(6288):     at java.lang.reflect.Method.invokeNative(Native Method)
02-24 12:08:08.875: E/AndroidRuntime(6288):     at java.lang.reflect.Method.invoke(Method.java:511)
02-24 12:08:08.875: E/AndroidRuntime(6288):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:803)
02-24 12:08:08.875: E/AndroidRuntime(6288):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:570)
02-24 12:08:08.875: E/AndroidRuntime(6288):     at dalvik.system.NativeStart.main(Native Method)

Я не могу найти решение, которое будет работать для меня, так что мне делать...


person Rohit    schedule 24.02.2014    source источник
comment
Не слишком ли велики ваши изображения? а можно ссылку на один из них?   -  person Androiderson    schedule 24.02.2014
comment
@ExceptionAl Это ссылка на изображение   -  person Rohit    schedule 25.02.2014
comment
@ExceptionAl Можете ли вы сказать мне, где я должен очистить кеш, это потому, что кеш не очищен.   -  person Rohit    schedule 25.02.2014


Ответы (2)


Спасибо г-ну Итай Хански,

После вашего предложения о OOM, что OOM не имеет отношения к сетевым компонентам, я искал любую другую причину, наконец, я нашел решение:

Это было из файла макета элемента списка, я установил android:src="" в Imageview. Когда я удаляю этот атрибут xml из ImageView, проблема с OOM решается.

Но я до сих пор не обнаружил, что когда я устанавливаю изображение для ошибки или условия загрузки, ошибка снова появляется, но я все еще не могу понять, в чем ее настоящая причина.

person Rohit    schedule 28.02.2014

Растровые изображения - реальная проблема в Android.

Во-первых, я настоятельно рекомендую вам прочитать этот пост на сайт разработчика.

Как реализован ваш BitmapLruCache? Вот несколько указателей (вы можете использовать только некоторые из них):

  1. Ограничьте количество растровых изображений, которые может хранить кэш.
  2. Ограничьте размер самого кеша. Ребята из Android предоставили хороший алгоритм, чтобы решить, насколько большим сделать его в связанной статье.
  3. По возможности звоните bitmap.recycle().
  4. Используйте слабые/мягкие ссылки на растровые изображения в вашем кеше вместо сильных.
  5. Ознакомьтесь с этим SO answer на аналогичный вопрос ( бессовестная самостоятельная вилка, но актуальная).

Вероятно, вам не нужно реализовывать все это одновременно. Выберите те, которые работают для вас.

person Itai Hanski    schedule 26.02.2014
comment
Я ничего не понимаю, я также использовал залп, UniversalImageLoader, UrlImageViewHelper, diskLruCache и ImageLoader, все они выдают OutOfMemoryError. Не могли бы вы объяснить мне, с чего я снова начинаю? Какой подход лучше, я хочу показывать изображения в адаптере gridView. - person Rohit; 26.02.2014
comment
OOM не имеет отношения к сетевому компоненту, это происходит, когда происходит сбой управления памятью и требуемый объем памяти превышает лимит на устройстве и ОС, которые вы используете. Прочитайте пост, который я связал. - person Itai Hanski; 26.02.2014