【问题标题】:Process crash (signal 11) on image handling图像处理过程崩溃(信号 11)
【发布时间】:2010-11-25 09:17:16
【问题描述】:

我的应用中有 3 个图像资源。 在 ImageView 中加载和显示其中任何一个都很顺利。 但是当我从布局中删除显示的 ImageView 时,将其设为空并 添加一个新图像,事情变得很奇怪。

当我尝试时,要么进程完全崩溃(信号 11) 在旧位图上调用 .recycle() 或者我得到一个 OutOfMemoryError 如果我不使用回收站。

这只发生在 API 级别低于 8 的情况下,所以我的猜测是 本机堆上的 GC 导致它,这些错误已修复 2.2.但是,由于 2.1 是目前最常见的版本 我需要一个解决方法...

同样,本机堆不应该缺少内存。我持有 一次只有一张图像,前一张为空,所以 GC 应该能够 检索堆空间(就像在 2.2 上发生的那样)。

我创建了一个非常小的示例应用程序,可以从 这里: http://www.4shared.com/file/QqHrhJLR/BitmapRecycleTest.html

任何建议将不胜感激。

【问题讨论】:

    标签: android


    【解决方案1】:

    我看过了。我在运行 2.2.1 的 Nexus One 上收到信号 11。调用栈是这样的:

    I/DEBUG   (   56):          #00  pc 0000c584  /system/lib/libc.so
    I/DEBUG   (   56):          #01  pc 0000cd2e  /system/lib/libc.so
    I/DEBUG   (   56):          #02  pc 0002c5dc  /system/lib/libskia.so
    I/DEBUG   (   56):          #03  pc 00068108  /system/lib/libskia.so
    I/DEBUG   (   56):          #04  pc 00063a8c  /system/lib/libskia.so
    I/DEBUG   (   56):          #05  pc 0004cefc  /system/lib/libandroid_runtime.so
    I/DEBUG   (   56):          #06  pc 00016e34  /system/lib/libdvm.so
    I/DEBUG   (   56):          #07  pc 000452c4  /system/lib/libdvm.so
    I/DEBUG   (   56):          #08  pc 0001bd98  /system/lib/libdvm.so
    ...
    

    显然这里的 Android 存在一个错误,但似乎是可以避免的。

    不要使用您的 BitmapResource 类...当您不再需要它们时,您应该明确地 recycle() 您的位图。我将您的 DrawView 构造函数更改为:

    public DrawView(Context context, int resId) {
        super(context);
        setImageResource(resId);
    }
    

    因为你的图片太大了 - 7MB 解压! - 在上一张图片被删除后,我还添加了System.gc()buttonClickHandler 现在看起来像这样:

    public void buttonClickHandler(View v) {
        Object tagObj = mSwitchButton.getTag();
        if (tagObj != null && tagObj instanceof ImageView) {
            ImageView iv = (ImageView)tagObj;
            iv.setImageBitmap(null);
                mMainLayout.removeView(iv);
            System.gc();
        }
    
        addNewViewToLayout(mMainLayout);
    }
    

    通过这些更改,您的应用对我来说运行良好。

    【讨论】:

    • 我发布的示例应用程序是从我遇到此问题的一个更大的应用程序派生的“最小重现代码”。我需要 BitmapResource,因为在大型应用程序中这个类中有更多的逻辑。其终结器中的 .recycle 调用在那里,因为我加载和卸载了许多 bmp,所以我不能显式调用 recycle() 因为我将在整个地方进行回收调用。但是,您建议的解决方案确实解决了我发布的问题,并让我考虑完全放弃回收调用并在某些地方传播 System.gc() 调用。感谢您的帮助!
    【解决方案2】:

    伙计,尝试以某种方式清除图像缓存...我遇到了类似的问题。这是我的帖子SIGNAL 11 SIGSEGV crash Android

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-02-09
      • 1970-01-01
      • 1970-01-01
      • 2018-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多