如何正确回收片段中的位图?

时间:2016-08-30 21:03:48

标签: android android-fragments bitmap

我有一个应用程序,其中包含一些片段,其中一个片段 我有一个自定义视图,我在其中创建了几个位图来绘制它们。

问题是: 当我交换片段时,一切都很好,直到我到达自定义视图所在的那个。问题是,当我一次又一次地选择片段(具有CustomView)时,RAM会增加然后应用程序崩溃。

我已经检查了位图的创建和回收方式,但我找不到解决方案。

代码:

private Bitmap getCircle() {

    if (mDstBitmap == null) {
        mDstBitmap = Bitmap.createBitmap(mWidth, mHeight, Bitmap.Config.ARGB_8888);

        c = new Canvas(mDstBitmap);
        c.drawColor(Color.TRANSPARENT);

        p = new Paint(Paint.ANTI_ALIAS_FLAG);
        p.setColor(Color.RED);
        c.drawOval(new RectF(0, 0, mWidth, mHeight), p);
    }

    return mDstBitmap;
}



@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);

    int viewWidthHalf = getWidth() / 2;
    int viewHeightHalf = getHeight() / 2;

    float radius = 0.0f;
    if (viewWidthHalf > viewHeightHalf)
        radius = (viewHeightHalf / 2);
    else
        radius = (viewWidthHalf / 2);


    circle = getCircle();

    canvas.drawBitmap(circle, 0, 0, mBitmapPaint);

}

我正在考虑这样的事情,但这不起作用:

@Override
protected void onDetachedFromWindow() {
    super.onDetachedFromWindow();
    delete();
}


public void delete(){
    if (mDstBitmap != null) {
        mDstBitmap.recycle();
    }

    if (linesBitmap != null) {
        linesBitmap.recycle();
    }
}

1 个答案:

答案 0 :(得分:0)

您应该将删除功能移至onDestroy。更好的是,将其移至onPause,但请确保将位图变量设置为null,以便在需要时重新创建它们。
我希望您绘制的位图还有更多内容,因为它没有理由在onDraw调用中将其绘制到画布上,并跳过创建位图。