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
Du musst angemeldet sein, um einen Kommentar abzugeben.
Offensichtlich hast du ein Speicherleck. Lesen Sie, wie Sie vermeiden von Speicherlecks und wie finden von Speicherlecks.
Hier ist ein code-Refactoring verwenden, WeakReference:
InformationsquelleAutor der Antwort Peter Knego
Etwas, dass mich geprägt in deinem code ist, dass Sie nicht recyceln Sie alle Ihre bitmaps offenbar. Hier sind ein paar code-snippets, die helfen könnten:
und:
InformationsquelleAutor der Antwort Jason Rogers