Android benutzerdefinierte Ansicht Bitmap-Speicherleck

Habe ich eine benutzerdefinierte Ansicht in der ich zeichnen müssen zwei bitmaps, von denen eines als hintergrund, repräsentiert das Bild einer Karte und einer pin, die gezogen werden die top/left position im canvas-Bereich.

Die beiden Bilder sind gezeichnet onDraw und bleiben die gleichen während der live von der Aktivität, die die Sicht enthält. Nach einer Weile bekomme ich eine

OutOfMemoryError: bitmap size exceeds
VM budget

Dies bedeutet, dass ich ein Leck, und die bitmaps nicht bekommen, Müll gesammelt. Ich habe diese Frage gestellt, bevor, aber jetzt ist die situation ein wenig geändert. Ich machte eine init-Methode, wo ich die bitmaps, die ich verwenden wollen, aber dies ist immer noch nicht ein guter Ansatz, tritt der Fehler später, aber immer noch da.

Hier ist der code

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();
 }
}

Nenne ich die setMapBitmap() und init() in onCreate der activity, die die Sicht enthält. Dort weiß ich, was bitmap als Karte. onPause der Tätigkeit nenne ich die destroy() in der Ansicht. Ich bekomme immer noch Fehler.
Ich habe gelesen das diese aber ich weiß nicht, wie man sich es in meinem Fall

ICH BIN OFFEN FÜR JEDE ANDERE LÖSUNG. Bitte beachten Sie, dass ich brauche, um die Größe der bitmap-Karte (basierend auf der Höhe des Layouts, die es enthält, in mai-Aktivität) und noch in der Lage zu zeichnen Sie die position auf die richtige Stelle.

InformationsquelleAutor der Frage Alin | 2010-11-16

Schreibe einen Kommentar