Android内存在绘制位图时泄漏

时间:2014-12-11 23:11:59

标签: android memory garbage-collection

每次用户触摸地图位置的屏幕时,我都会在地图上绘制位图。 位图是我创建的布局的“图片”。

当我监控内存分配时,我发现内存分配不断增长, 即使在GC之后......

我正在重用位图,所以下面的代码出了什么问题?

每次用户触摸屏幕时,都会调用此方法,并且ondraw方法绘制返回的overalldrawing:

    public Bitmap LoadBitmapFromView(RelativeLayout drawingCanvas, int width,int height)
    {
        drawingCanvas.LayoutParameters=(new RelativeLayout.LayoutParams(width, height));
        drawingCanvas.Measure(MeasureSpec.MakeMeasureSpec(drawingCanvas.LayoutParameters.Width, MeasureSpecMode.Exactly),
        MeasureSpec.MakeMeasureSpec(drawingCanvas.LayoutParameters.Height, MeasureSpecMode.Exactly));
        drawingCanvas.Layout(0, 0, drawingCanvas.MeasuredWidth , drawingCanvas.MeasuredHeight);
        Bitmap overAllDrawing = Bitmap.CreateBitmap(width, height, Bitmap.Config.Argb8888);
        Canvas canvas = new Canvas(overAllDrawing);
        drawingCanvas.Draw(canvas);
        return overAllDrawing;
    }


    protected override void OnDraw(Canvas canvas) 
    {
        base.OnDraw(canvas);

        if (!IsImageReady)
        {
            return;
        }

        PointF xMin = ViewToSourceCoord (0f,0f) ;
        PointF xMax = ViewToSourceCoord (metrics.WidthPixels, 0f);

        PointF vPin;
        float vX;
        float vY;
        foreach (Location location in locations)
        {
            if ( (location.X > xMin.X) && (location.X < xMax.X))
                //&& (location.Y > yMin.Y) && (location.Y < yMax.Y) )  slows down performance
            {   
                vPin = SourceToViewCoord (new PointF ((float)location.X, (float)location.Y));
                vX = vPin.X - (pin.Width / 2);
                vY = vPin.Y - pin.Height;
                canvas.DrawBitmap (pin, vX, vY, paint);
            }

        }
        if (sChar != null && character != null) 
        {
            //draw character
            PointF vChar = SourceToViewCoord (sChar);
            float vCharX = vChar.X;
            float vCharY = vChar.Y - character.Height;
            canvas.DrawBitmap (character, vCharX, vCharY, paint);
        }
        if (pinPushed) 
        {
            PointF vInfo = SourceToViewCoord ((float)selectedLocation.X, (float)selectedLocation.Y);
            float vInfoX = vInfo.X - (info.Width / 2) + (int)ConvertDpToPix (7);//8 pixels cause image is not in the middle
            float vInfoY = vInfo.Y - info.Height;
            canvas.DrawBitmap (textBalloonBitmap, vInfoX, vInfoY, paint);
            vInfo = null;
        }

    }

0 个答案:

没有答案