我的应用程序中有3个图片资源。在ImageView中加载和显示它们中的任何一个都很顺利。但是,当我从布局中删除显示的ImageView,将其设为空并添加一个新图像时,事情变得很奇怪。
要么当我尝试在旧的位图上调用.recycle()时,进程完全崩溃(信号11),要么我得到一个OutOfMemoryError,以防我不使用循环。
这只在API级别低于8的情况下发生,所以我猜测是本机堆上的GC错误引起的,这些错误已修复到2.2。然而,由于2.1是目前最常见的版本,我需要一个变通办法……
同样,本机堆不应该缺少内存。我一次只保存一个图像,并且前一个图像为空,因此GC应该能够检索堆空间(就像在2.2中发生的那样)。
我已经创建了一个非常小的示例应用程序,可以从这里下载:http://www.4shared.com/file/QqHrhJLR/BitmapRecycleTest.html
任何建议都将不胜感激。
发布于 2010-11-25 18:53:26
我看过了。我在运行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在这里有一个bug,但它似乎是可以避免的。
不要使用您的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);
}有了这些改变,你的应用程序对我来说运行得很好。
发布于 2011-02-12 03:48:43
伙计,试着以某种方式清除图像缓存...我也有类似的问题。这是我的帖子SIGNAL 11 SIGSEGV crash Android
https://stackoverflow.com/questions/4275383
复制相似问题