0

我有一个用户评论说,在我的应用程序中查看一堆图像后,它崩溃了(他认为这是由于内存不足错误)。我有以下相关代码:

    int themeID = mNav[mPos];
    String icon = getThemeData(DbAdapter.KEY_ICON, themeID);
    ImageView viewer = (ImageView)findViewById(R.id.viewer);

    Bitmap bMap = null;
    try {
        bMap = getJPG(icon + ".jpg");
    } catch (IOException e) {
        e.printStackTrace();
    }


    viewer.setImageBitmap(bMap);

当用户在图像之间翻转时,它会重新运行。从这里我看到你应该在位图上调用 recycle() 。设置图像后是否需要在 bMap 上调用它?或者在设置下一个之前有什么方法可以将它从 viwer 中拉出来?

根据回收的文档(如果我在 bMap 上调用它),我似乎不需要使用它:这是一个高级调用,通常不需要调用,因为正常的 GC 进程会在出现时释放此内存不再引用此位图。

4

1 回答 1

0

如果你需要显式调用recycle()它可能意味着你有内存泄漏。调用它几乎从来都不是解决方案。

您是否尝试检查您的应用程序是否存在潜在的内存泄漏?

要检查它,您可以例如旋转您的设备几次并检查垃圾收集器的行为方式。你应该有类似 GC_... 释放 211K,71% 释放 300K/1024K,外部 0K/0K,几乎每次旋转时在 LogCat 中暂停 1ms+1ms。注意这部分的变化:300K/1024K。如果您没有内存泄漏,那么第一部分应该会在几次 GC 后增长然后变小。如果您有内存泄漏,它会不断增长,直至出现 OOM 错误。

查看我关于内存泄漏的其他答案。

如果您确定没有泄漏并且您在 Honeycomb 上运行,您可以像这样增加您的应用程序可访问的堆大小:android:largeHeap="true"但仅在处理一些 huuuge 位图或视频时才建议这样做,所以不要过度使用它

于 2012-05-28T15:49:43.743 回答