处理图像处理崩溃(信号11)

时间:2010-11-25 09:17:16

标签: android

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

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

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

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

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

任何建议都将受到赞赏。

2 个答案:

答案 0 :(得分:1)

我看了一眼。我在运行2.2.1的Nexus One上获得信号11。 callstack是这样的:

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类......你应该在你不再需要它们的那一刻明确地回收()你的位图。我将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);
}

通过这些更改,您的应用可以正常运行。

答案 1 :(得分:0)

老兄,试着以某种方式清除图像缓存......我和我有类似的问题。这是我的帖子SIGNAL 11 SIGSEGV crash Android