Как динамически обновлять определенный элемент наложения

Я разрабатываю приложение для Android, основанное на местоположении, которое имеет дело с множеством элементов наложения.

Предыстория. Есть довольно много объектов, которые я хочу отобразить на карте. Координаты сущностей меняются в реальном времени по мере изменения их местоположения. В соответствии с обновленным местоположением объекты должны быть обновлены на карте. Сущностей может вырасти до большого количества.

Реализация У меня есть два наложения. Один для MyLocationOverlay для отображения местоположения пользователя, а другой — подкласс ItemizedOverlay со всеми объектами, которые мне нужно отобразить на карте.

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

  1. Когда я получаю местоположение определенного объекта, я удаляю все наложения с карты и снова добавляю наложения. Один из элементов наложения теперь создается с обновленным местоположением.

    List<Overlay> overlays = map.getOverlays();
    overlays.removeAll(overlays);
    overlays.add(new MyOverlay(marker,this));
    
  2. Я создаю наложение для каждой сущности. Это означает, что я создам 500 наложений, каждое из которых будет содержать только один элемент наложения. Я создаю подкласс класса Overlay и добавляю свои собственные свойства, чтобы четко идентифицировать объект и создавать по одному для каждого. Когда я достигаю обновления местоположения определенного объекта, я выполняю итерацию и получаю конкретный элемент наложения, удаляю его и добавляю новый с обновленным местоположением.

Я не знаю, какой из них лучше всего использовать с точки зрения производительности.

Я чувствую, что удаление всех и повторное добавление всех наложений для каждого отдельного обновления местоположения (что может быть довольно часто) каждого отдельного объекта становится довольно накладным, когда количество объектов становится более 500 или 1000.

В то же время повторение одного и того же количества сущностей также может быть равно затратным.

Будем признательны за любые советы о том, какой из них выбрать, или лучший способ реализовать это.

/Энди


person andy    schedule 18.07.2012    source источник


Ответы (3)


Я считаю, что лучшим решением (с точки зрения производительности) является создание собственного класса Overlay, который наследуется от класса Overlay, чтобы вы могли переопределить метод onDraw так, как хотите. См. этот предыдущий пост SO, чтобы понять, как это сделать. Если вы хотите избежать этого, вы можете проверить ItemizedOverlay, если вы еще этого не сделали. Это более эффективно, чем создание Overlay для каждой сущности, однако не так эффективно, как предложенный первый подход.

person Angelo    schedule 20.07.2012
comment
Итак, вы предлагаете создать один пользовательский класс наложения и нарисовать на нем все мои объекты? Какой из них будет иметь лучшую производительность - пользовательский класс наложения, как вы предложили, со всеми 500 объектами или аналогичный пользовательский класс наложения, по одному для каждого объекта (будет 500 объектов пользовательского класса наложения) - person andy; 23.07.2012
comment
Я считаю, что однозначного ответа нет, так как это зависит от реализации пользовательского класса наложения. Если бы я хотел быть уверенным в производительности, я бы реализовал простой тестовый пример для этих двух подходов и посмотрел, какой из них имеет лучшую производительность. - person Angelo; 24.07.2012

У меня была та же проблема, и то, что я сделал, это ваш первый выбор.

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

person zapotec    schedule 27.07.2012

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

Чтобы показать OverlayItems, используйте ItemizedOverlay. В методе ItemizedOverlay.createItem(int position) вы можете получить OverlayItem набора. Не забудьте переопределить метод ItemizedOverlay.getSize() с помощью return set.size().

С этим вызовом populate() в ItemizedOverlay каждый раз, когда вы обновляете набор.

Ознакомьтесь с этим учебником, чтобы получить дополнительную информацию, или оставьте комментарий, если у вас есть вопросы. .

person RaphMclee    schedule 27.07.2012