为什么logcat被GC信息垃圾邮件?

时间:2012-02-29 09:39:14

标签: java android garbage-collection

如果我对此块进行评论,那么GC垃圾邮件就会消失。是什么导致了垃圾邮件?如果我注释掉“//清理”部分,那么垃圾邮件仍在那里。

public void updatePixels()
{
    // Fill the bitmap with black.
    mBitmap.eraseColor(Color.BLACK);

    // Pass bitmap to be rendered by native function.
    if(!mNativeHelper.render(mBitmap)) return;


    // If FroyVisuals has text to display, then use a canvas and paint brush to display it.
    String text = mActivity.mTextDisplay;
    if(text != null)
    {
        // Give the bitmap a canvas so we can draw on it.
        mCanvas.setBitmap(mBitmap);

        Paint paint = new Paint();
        paint.setAntiAlias(true);
        paint.setTextSize(10);
        paint.setTypeface(Typeface.create(Typeface.SERIF, Typeface.ITALIC));
        paint.setStyle(Paint.Style.STROKE);
        paint.setStrokeWidth(1);
        paint.setColor(Color.WHITE);
        paint.setTextAlign(Paint.Align.CENTER);

        float canvasWidth = mCanvas.getWidth();
        float textWidth = paint.measureText(text);
        float startPositionX = (canvasWidth - textWidth / 2) / 2;

        mCanvas.drawText(text, startPositionX, mTextureWidth-12, paint);
        paint = null;
    }

    // Flip the texture vertically.
    Matrix flip = new Matrix();

    flip.postScale(1f, -1f);

    Bitmap temp = Bitmap.createBitmap(mBitmap, 0, 0, mBitmap.getWidth(), mBitmap.getHeight(), flip, true);

    // Copy bitmap pixels into buffer.
    mPixelBuffer.rewind();

    temp.copyPixelsToBuffer(mPixelBuffer);

    // Cleanup
    temp.recycle();
    temp = null;
    flip = null;
}

1 个答案:

答案 0 :(得分:1)

我不确定你用“这个块”指的是哪个部分所以我认为你的意思是整个方法。您正在此方法中创建对象

这里

Paint paint = new Paint();

在这里

 Bitmap temp = Bitmap.createBitmap(mBitmap, 0, 0, mBitmap.getWidth(), mBitmap.getHeight(), flip, true);

因此,如果经常调用此方法,您会看到这些对象很多。您应该使用不需要在每次调用时创建对象的方法。例如,您可以在第一次运行方法时创建bitmap,然后操纵该位图的canvas以实现翻转。

您可以抓取canvas in the constructor并使用rotate()在每次方法调用开始时进行操作。这样,您就可以在第一次方法调用时创建BitmapCanvas

此外,每当你创建一个Bitmap时,这也可以为此分配视频内存,所以它看起来效率更低!