Android affichage personnalisé Bitmap fuite de mémoire

J'ai un affichage personnalisé dans lequel j'ai besoin de tirer deux images, l'une est d'un arrière-plan représentant l'image d'une carte et un code pin qui sera tiré en haut à gauche de la position dans la toile.

Les deux images sont tirées onDraw et restent les mêmes au cours de la vivre de l'activité qui contient la vue. Après un certain temps, je reçois un

OutOfMemoryError: bitmap taille dépasse
VM budget

Cela signifie que j'ai une fuite et les bitmaps ne pas obtenir ramasse miettes. J'ai posé cette question avant, mais maintenant la situation a un peu changé. J'ai fait une méthode init où j'ai mis les images que je veux utiliser, mais ce n'est toujours pas une bonne approche, l'erreur apparaît plus tard, mais toujours là.

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

J'appelle le setMapBitmap() et init() sur onCreate de l'activité qui contient la vue. Là je sais ce que bitmap sera utilisé comme carte. onPause de l'activité que j'appelle le détruire() de la vue. Je reçois encore des erreurs.
J'ai lu ce cette mais je ne sais pas comment l'adapter à mon cas

JE SUIS OUVERT À TOUTE AUTRE SOLUTION. Veuillez noter que j'ai besoin de redimensionner la carte bitmap (en fonction de la hauteur de la disposition qu'il contient en mai de l'activité) et être encore capable de tracer la position correcte de la place.

  • Ne vous lancez ce sur émulateur ou un appareil? Sous débogueur ou sans elle?
  • J'ai couru sur mon émulateur sans déboguer. Avec le débogage activé est trop lent. Je vous remercie.
  • Pourquoi ne pas vous désactivez la mapBitmap lorsque vous avez resizedBitmap ? Une autre chose est de redimensionner l'image lorsque vous en avez besoin, c'est à dire redimensionner l'image bitmap dans onDraw puis de l'annuler, de sorte qu'il peut être GC ed.
InformationsquelleAutor Alin | 2010-11-16