我的应用中有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
任何建议都将受到赞赏。
答案 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