а также:

я есть пользовательский вид, в котором мне нужно нарисовать два растровых изображения, одно - фон, представляющий изображение карты, а другое - булавку, которая будет нарисована сверху / слева на холсте.

Оба изображения нарисованы в onDraw и остаются неизменными в течение действия действия, содержащего представление. Через некоторое время я получаю

OutOfMemoryError: размер растрового изображения превышает бюджет виртуальной машины

Это означает, что у меня есть утечка, и растровые изображения не собирают мусор. Я задавал этот вопрос раньше, но сейчас ситуация немного изменилась. Я сделал метод init, в котором я установил точечные рисунки, которые я хочу использовать, но это все еще не очень хороший подход, ошибка появляется позже, но все еще там.

Вот код

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

Я вызываю setMapBitmap () и init () для onCreate действия, которое содержит представление. Там я знаю, какое растровое изображение будет использоваться в качестве карты. onPause действия, которое я вызываю destroy () представления. Я все еще получаю ошибки. Я прочитал этоэтот но я не знаю, как адаптировать его в моем случае

Я ОТКРЫТ ДЛЯ ЛЮБОГО ДРУГОГО РЕШЕНИЯ. Обратите внимание, что мне нужно изменить размер растрового изображения карты (в зависимости от высоты макета, который содержит его в основной деятельности) и все еще иметь возможность рисовать положение в правильном месте.

Ответы на вопрос(2)

Ваш ответ на вопрос