【问题标题】:Potential Out of Memory error with multiple bitmaps多个位图的潜在内存不足错误
【发布时间】:2012-06-02 23:12:51
【问题描述】:

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

    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);

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

根据回收的文档(如果我在 bMap 上调用它)看来我不需要使用它:这是一个高级调用,通常不需要调用,因为正常的 GC 过程会释放它没有更多对该位图的引用时的内存。

【问题讨论】:

    标签: android memory bitmap


    【解决方案1】:

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

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

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

    Check out我关于内存泄漏的另一个答案。

    如果您确定没有泄漏并且您在 Honeycomb 上运行,您可以像这样增加您的应用程序可访问的堆大小:android:largeHeap="true" 但仅在处理一些 huuuge 位图或视频,so don't overuse it

    【讨论】:

    • 尝试旋转。根据您的条款,这似乎不是内存泄漏。从 5000 到 7000 再回到 5000,然后在旋转 20-30 次后反弹。
    • 是的,看起来没问题。也许这不是 OOM 错误?他怎么知道是一个?他有FC?也许告诉他复制报告并将其发送给您(这是一个堆栈跟踪)?不过,我不确定报告是否出现在所有系统上。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-21
    • 1970-01-01
    相关资源
    最近更新 更多