【问题标题】:OutOFMemory error in volley library凌空库中的 OutOFMemory 错误
【发布时间】:2014-02-24 05:46:23
【问题描述】:

这就是我正在做的,首先进入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 的数组,image 是 NetworkImageView 的对象。当我执行它时,我得到了 OutOfMemory 的错误。这是我的 logcat o/p :-

    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)

我找不到任何适合我的解决方案,所以我该怎么办...

【问题讨论】:

  • 你的图片是不是太大了?你能提供一个指向其中一个的链接吗?
  • @ExceptionAl 这是image的链接
  • @ExceptionAl 你能告诉我应该在哪里清除缓存,这是因为缓存没有清除。

标签: android android-volley


【解决方案1】:

感谢 Itai Hanski 先生,

在您建议OOM与网络组件无关的OOM之后,我一直在寻找任何其他原因,最后我找到了解决方案:

它来自列表视图项的布局文件,我已将android:src="" 设置为 Imageview。 当我从 ImageView 中删除这个 xml 属性时,OOM 问题就解决了。

但有一件事我仍然没有发现,当我为错误或加载条件设置图像时,错误再次出现,我仍然无法理解它的真正原因。

【讨论】:

    【解决方案2】:

    位图在 android 中是一个真正的问题。

    首先 - 我真的建议您阅读开发者网站上的 this post

    您的BitmapLruCache 是如何实现的?以下是一些提示(您只能使用其中的一些):

    1. 限制缓存可以容纳的位图数量。
    2. 限制缓存本身的大小。 Android 人员提供了一个很好的算法来决定链接文章中的大小。
    3. 如有可能,请致电bitmap.recycle()
    4. 对缓存中的位图使用弱/软引用,而不是强引用。
    5. 查看SO answer 的类似问题(无耻的自我插入,但相关)。

    您可能不需要同时实现所有这些。选择适合您的。

    【讨论】:

    • 我看不懂,我用过volley、UniversalImageLoader、UrlImageViewHelper、diskLruCache和ImageLoader,都报OutOfMemoryError。你能解释一下我从哪里开始,哪种方法更好,我想在 gridView 适配器中显示图像。
    • OOM 与网络组件无关,它发生在内存管理失败并且您需要的内存量超过您正在运行的设备和操作系统的限制时。阅读我链接的帖子。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多