从视图创建位图时的Android OOM

时间:2015-06-02 17:45:55

标签: android bitmap out-of-memory

我正在创建一个布局位图。它在大多数设备上运行良好,但在很少的三星设备中,它抛出OOM。下面是我用来将布局转换为位图的代码

private void enableViewCache() {
    viewToConvert.setDrawingCacheEnabled(true);
    viewToConvert.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.AT_MOST),
            MeasureSpec.makeMeasureSpec(0, MeasureSpec.AT_MOST));
    viewToConvert.buildDrawingCache(true);
}

public Bitmap getBitmapFromView() {

    Bitmap b = Bitmap.createBitmap(viewToConvert.getDrawingCache());
    viewToConvert.setDrawingCacheEnabled(false);
    viewToConvert.destroyDrawingCache();
    ByteArrayOutputStream bytes = new ByteArrayOutputStream();
    b.compress(Bitmap.CompressFormat.JPEG, 100, bytes);
    return b;
}

我在Bitmap.createBitmap调用时得到了OOM。我已经检查了stackoverflow中的大多数OOM位图问题,其中提到了使用抽样和所有但我不知道如何在这个用例中实现它。

1 个答案:

答案 0 :(得分:0)

我不确定您要完成的任务,但在大多数情况下,您不希望从Bitmap中提取View。你通常想要的是将位图保存在不同的地方(LRU Cache可能?)。我的猜测是视图的绘图缓存是问题。

无论如何,问题可能就是你处理大位图的方式。 Read this article所以你知道如何采样,缩小和其他技术,这样你就不会得到OOM。