Cómo actualizar dinámicamente un elemento de superposición específico

Estoy desarrollando una aplicación basada en la ubicación de Android que se ocupa de la gran cantidad de elementos de superposición.

Antecedentes: Hay bastantes entidades que quiero mostrar sobre un mapa. Las coordenadas de las entidades cambian en tiempo real a medida que su ubicación cambia. Correspondientes a la ubicación actualizada, las entidades se actualizarán en el mapa. Las entidades pueden crecer a un gran número.

La Implementación Tengo dos superposiciones. Uno para MyLocationOverlay para mostrar la ubicación del usuario y el otro, una subclase ItemizedOverlay con todas las entidades que necesito mostrar en el mapa.

El problema Cuando se cambia la ubicación de una entidad, se debe actualizar el elemento de superposición correspondiente. El problema es que no estoy seguro de cuál es la mejor manera de lograr esto. Tengo estas opciones

  1. Cuando recibo una ubicación de una entidad en particular, elimino todas las superposiciones del mapa y vuelvo a agregar las superposiciones. Uno de los elementos superpuestos ahora se crea con la ubicación actualizada.

    List<Overlay> overlays = map.getOverlays(); overlays.removeAll(overlays); overlays.add(new MyOverlay(marker,this)); 
  2. Creo una superposición para cada entidad. Lo que significa que va a crear 500 superposiciones, cada uno contiene sólo un elemento de superposición. Creo una subclase de la clase Overlay y añado mis propias propiedades para identificar claramente la entidad y crear una para cada una. Cuando llego a la actualización de ubicación de una entidad en particular, iterar y obtener el elemento de superposición específica, quitar y agregar uno nuevo con la ubicación actualizada.

No sé cuál es el mejor para usar el rendimiento sabio.

Me siento eliminando todo y volver a agregar todas las superposiciones para cada actualización de ubicación única (que puede ser muy a menudo) de cada sola entidad se convierte en una sobrecarga cuando el número de entidades se convierten en más de 500 o 1000.

Al mismo tiempo, iterar a través del mismo número de entidades también puede ser igual.

Cualquier consejo sobre cuál elegir o una mejor manera de implementar esto sería apreciado.

Andy

Creo que la mejor solución (en cuanto a rendimiento) es crear una clase de superposición personalizada que hereda de la clase Overlay para que pueda reemplazar el método onDraw la manera que desee. Vea este post anterior de SO para tener una idea de cómo hacerlo. Si desea evitarlo, puede comprobar el ItemizedOverlay , si no lo ha hecho ya. Es más eficiente que crear una Overlay para cada entidad, pero no tan eficiente como el primer enfoque sugerido.

Tuve el mismo problema, y ​​lo que hice fue tu primera elección.

De todos modos, antes de agregarlos al mapa, cargarlos en un hilo diferente y después de haber cargado todas las imágenes y datos, agréguelos en el mapa del hilo principal.

Le sugiero que guarde sus elementos de superposición en un HashSet con sus entidades como claves. Cuando se actualiza una entidad, puede crear un nuevo OverlayItem y almacenarlo en el conjunto. Como se trata de un conjunto, el antiguo OverlayItem se eliminará.

Para mostrar el OverlayItems utilizar un ItemizedOverlay. En el método ItemizedOverlay.createItem ItemizedOverlay.createItem(int position) puede obtener el OverlayItem del conjunto. No olvide anular el método return set.size() con return set.size() .

Con esa llamada populate() en el ItemizedOverlay cada vez que actualizó el conjunto.

Mire este Tutorial para más información o ponga un comentario si tiene preguntas.

  • No puede encontrar la ubicación exacta actual en android
  • ¿Cómo puedo obtener las coordenadas de un mapa al toque con MapFragment (no MapView)?
  • Cómo obtener Ciudad y País de un usuario en android sin GPS?
  • obtener la ubicación actual (gps / wifi)
  • Getlastknownlocation siempre devuelve null después de reinstalar el archivo apk a través de eclipse
  • Emulador de Android - DDMS "control de emulador" está deshabilitado mientras ejecuta buildroid / emulador basado en virtualbox
  • Obtención de la ubicación actual de un dispositivo mediante la función {X} api
  • Cómo obtener el usuario Inicio / Lugar de trabajo de un usuario en Android
  • FusedLocationApi.getLastLocation siempre null
  • ¿Android ProximityAlert o Geofence drenan más batería cuando el teléfono está más cerca de una ubicación supervisada?
  • Android Advertencia: JAR no existe o no contiene recursos
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.