Android карты увеличить - OutOfMemory - PullRequest
0 голосов
/ 11 июля 2011

Когда я время от времени увеличиваю или уменьшаю масштаб своей деятельности на карте, в консоли появляется сообщение «Ошибка OutOfMemory: размер растрового изображения превышает бюджет виртуальной машины». Приложение не работает на моем телефоне, но я не уверен, что эта проблема не вызовет проблем в будущем.

Примечание. На карте отображается максимум 30 пользовательских маркеров.

Стек ошибок не ссылается на мой код. У кого-нибудь есть исправление или лучшая практика, чтобы избавиться от этой ошибки?

Заранее спасибо.

public void onCreate(Bundle savedInstanceState) { 
...
marker = getResources().getDrawable(R.drawable.marker);
...
fillData();
}
public void fillData() {
...
  for (int i = 0; i < lats.length; i++) {
    ...
    map.getOverlays().add(new ContactOverlay(marker, tempLat, tempLon, names[i],
                phones[i]));
   }
}

private class ContactOverlay extends ItemizedOverlay<OverlayItem> {
    private List<OverlayItem> items = new ArrayList<OverlayItem>();

    public ContactOverlay(Drawable marker, double latitude,
            double longitude, String title, String snippet) {
        super(marker);
        boundCenterBottom(marker); 
        items.add(new OverlayItem(getPoint(longitude, latitude), title,
                snippet)); 
        populate();
    }

    @Override
    protected OverlayItem createItem(int i) {
        return (items.get(i));
    }
    ...
 }

Ответы [ 2 ]

2 голосов
/ 11 июля 2011

Попробуйте повторно использовать растровое изображение и холст, на котором вы рисуете. Каждый раз, когда вы перерисовываете наложение, создается новое растровое изображение.

1 голос
/ 12 июля 2011

@ Дорин, я отправляю ответ, потому что ответ слишком длинный.

Я думаю, что это нормально, но это не проблема.Каждый раз, когда вы перерисовываете наложение, создается новое растровое изображение. Вы не можете его увидеть, потому что это происходит в методе onDraw, и наложение делает это.Итак, давайте представим, что вы перерисовали оверлей 10 раз.10 растровых изображений созданы.Если GC не очищает эти 10 растровых изображений, при создании следующего ОС пытается выделить память для нового растрового изображения.Если в куче недостаточно памяти, генерируется исключение, а затем GC освобождает память, выделенную для предыдущих 10 битовых карт.То, что вам нужно сделать, это избежать выделения памяти для растровых изображений.Создайте базовый класс наложения и расширьте ItemizedOverlay.Переопределите метод onDraw () и создайте растровое поле.Каждый раз, когда вызывается onDraw (), перезапускайте растровое изображение и снова рисуйте на нем.Таким образом вы избежите нового воссоздания растрового изображения -> исключение OutOfMemory *

...