首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Android自定义视图位图内存泄漏

Android自定义视图位图内存泄漏
EN

Stack Overflow用户
提问于 2010-11-17 02:47:02
回答 2查看 18.1K关注 0票数 18

我有一个自定义视图,我需要在其中绘制两个位图,一个是背景,表示地图的图像,另一个是将在画布上/左位置绘制的图钉。

这两个图像都是onDraw绘制的,并且在包含视图的活动期间保持不变。过了一段时间,我得到了一个

OutOfMemoryError:位图大小超过虚拟机预算

这意味着我有一个漏洞,位图不会被垃圾回收。我以前问过这个问题,但现在情况发生了一些变化。我做了一个init方法,设置了我想使用的位图,但这仍然不是一个好的方法,错误稍后出现,但仍然存在。

以下是代码

代码语言:javascript
复制
public class MyMapView extends View {
private int xPos = 0;
private int yPos = 0;
private int space = 0;

private Bitmap resizedBitmap;
private Bitmap position;
private Bitmap mapBitmap;

public void setMapBitmap(Bitmap value) {
    this.mapBitmap =  value;
}

public MyMapView(Context context) {
 super(context);
}

public MyMapView(Context context, AttributeSet attrs) {
 super(context, attrs);
}

public MyMapView(Context context, AttributeSet attrs, int defStyle) {
 super(context, attrs, defStyle);
}

public void init(final Context context) {
 Paint paint = new Paint();
    paint.setFilterBitmap(true);

    int width = getMeasuredWidth();
    int height = getMeasuredHeight();

    resizedBitmap = Bitmap.createScaledBitmap(mapBitmap, height, height, true);
    position = BitmapFactory.decodeResource(getContext().getResources(), R.drawable.position);
    space = (width - resizedBitmap.getWidth()) / 2;
}

public void destroy()
{
 resizedBitmap.recycle();
 resizedBitmap=null;
 position.recycle();
 position=null;
 mapBitmap.recycle();
 mapBitmap=null;
}

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
  setMeasuredDimension(MeasureSpec.getSize(widthMeasureSpec), MeasureSpec.getSize(heightMeasureSpec));
}

@Override
protected void onDraw(Canvas canvas) {

     if (mapBitmap != null) {
         canvas.drawBitmap(resizedBitmap, space, 0, null);
     }

     if (xPos != 0 && yPos != 0) {
         canvas.translate(xPos + space - position.getWidth() / 2, yPos - position.getHeight() / 2);
         canvas.drawBitmap(position, new Matrix(), new Paint());

     }
}

 public void updatePosition(int xpos, int ypos)
 {
   xPos = xpos;
      yPos = ypos;
      invalidate();
 }
}

我在包含视图的活动的onCreate上调用setMapBitmap()和init()。在那里我知道哪个位图将被用作贴图。我称之为视图的销毁()的活动的销毁。我仍然会收到错误。我读过这个this,但我不知道如何根据我的情况修改它

我对任何其他的解决方案都持开放态度。请注意,我需要调整地图位图的大小(基于mai活动中包含它的布局的高度),并且仍然能够在正确的地方绘制位置。

EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4197794

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档