java - Android 绘图 : outofmemoryerror VERSUS "cannot draw recycled bitmaps" error

标签 java android android-layout

我已经阅读了大量关于这两个错误的帖子,但似乎无法找到适合我的解决方案。 我有一个基本的动物 ListView Activity 。当您单击列表中的项目时,它会打开 AnimalViewActivity 并在 ImageView 中显示一个简单的 png 图像。

这是我为 ImageView 设置图像的地方:

public void getImage() {

    String imageName = myService.yourAnimals.get(key).getType();
    System.out.println(imageName);

    Resources res = getResources();
    int resourceId = res.getIdentifier(imageName, "drawable", getPackageName() );
    Drawable drawable = res.getDrawable( resourceId );
    image.setImageDrawable( drawable );
}

然后当我离开 AnimalViewActivity 返回 ListView Activity 时,我这样做:

@Override
protected void onDestroy() {
    super.onDestroy();
    //((BitmapDrawable)image.getDrawable()).getBitmap().recycle();
    image.getDrawable().setCallback(null);
    //System.gc();
    System.out.println("Destroy image!");
}

如果我取消注释 recycle() 行,我会收到“无法绘制回收位图”错误。 如果我让它保持原样,我会得到 bitmapfactory 的内存不足错误。

java.lang.IllegalArgumentException: 无法绘制回收位图 或者 java.lang.OutOfMemoryError 错误 android.graphics.BitmapFactory.nativeDecodeAsset(本地方法)

这些错误之一是在我打开 ViewAnimalActivity 大约 20 次并且应用程序崩溃后发生的。 唯一似乎永远有效的是 System.gc() ,但我知道这不是一个好的解决方案。

我是在android4.1上测试的,但是minSDK设置为android3.0

我读到位图回收的 javaVM 错误已在 3.0 中修复?

出于某种原因,如果不显式调用 gc.这些图像很小,大多在 100-300kB 之间。

有什么想法吗?

编辑: 它似乎更快乐
image.setImageDrawable( null );

我想我以前在 Android2.2 上设置它时尝试过这个,但到目前为止 Android3.0 对它很满意。

最佳答案

The documentation for recycle()明确指出它用于“高级用途”。实际上,将引用设置为 null 更为重要。

This is an advanced call, and normally need not be called, since the normal GC process will free up this memory when there are no more references to this bitmap.

此外,还有可能查看 Bitmap has been recycled在绘制之前。 (发布您的 logcat 以查看您遇到错误的位置。您可以添加代码来验证位图是否已被回收并重新加载)。

总的来说,我认为您最好看看 Android 培训类(class),了解如何 display Bitmaps efficiently .

关于java - Android 绘图 : outofmemoryerror VERSUS "cannot draw recycled bitmaps" error,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15284323/

相关文章:

java - 将 List 类型转换为 List<T> 的两种方法之间的区别

Android工具栏动态更改菜单操作项

android - 在android中更改我的ActionBar的背景颜色

Android镜像矢量可绘制

android - com.android.vending.billing.PURCHASES_UPDATED 什么时候广播?

Android:什么时候使用layout_margin,什么时候使用weightSum?

android - 滑动删除列表项

java - 删除 Rest Controller 中的方法 Cors 问题

java - 如何在java中迭代用户首选项的节点

java - 即使数据库已填充,ResultSet.next() 是否有可能返回空?