2012-07-18 11 views
6

Estoy desarrollando una aplicación de Android basada en la ubicación que se ocupa de muchos elementos superpuestos.Cómo actualizar dinámicamente un overlayitem específico

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

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 Cada vez que se cambia la ubicación de una entidad, es necesario actualizar la superposición correspondiente. El problema es que no estoy seguro de cuál es la mejor manera de lograr esto. Tengo estas opciones

  1. Como recibo una ubicación de una entidad en particular, elimino todas las superposiciones del mapa y volver a agregar las plantillas. 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 crearé 500 superposiciones, cada una con solo un elemento superpuesto. Creé una subclase de clase de superposición y agregué 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, repito y obtengo el elemento de superposición específico, lo elimino y agrego uno nuevo con la ubicación actualizada.

No sé cuál es el mejor para usar en cuanto al rendimiento.

me siento eliminación de todo y volver a agregar todas las superposiciones de cada actualización solo lugar (que puede ser muy a menudo) de toda entidad única se convierte en toda 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 a la sobrecarga.

Se agradecerá cualquier consejo sobre cuál elegir o una mejor manera de implementar esto.

/Andy

Respuesta

1

Creo que la mejor solución (respecto al rendimiento) es crear una clase de plantilla personalizada que hereda de la clase Overlay para que pueda reemplazar el método onDraw la manera deseada. Consulte esto previous SO post para tener una idea de cómo hacerlo. Si desea evitar eso, puede consultar el ItemizedOverlay, si aún no lo ha hecho. Es más eficiente que crear un Overlay para cada entidad, pero no tan eficiente como el primer enfoque sugerido.

+0

¿Así que sugieres que crees una única clase de superposición personalizada y que todas mis entidades estén dibujadas sobre eso? ¿Cuál tendrá un mejor rendimiento? Una clase de superposición personalizada como ha sugerido con las 500 entidades o clases de superposición personalizadas similares, una para cada entidad (habrá 500 objetos de clase de superposición personalizada) – andy

+3

Creo que no hay una respuesta definitiva desde eso depende de la implementación de la clase de superposición personalizada. Si quería estar seguro del rendimiento, implementaría un caso de prueba simple para estas dos evaluaciones y vería cuál de ellas tiene el mejor rendimiento. – Angelo

0

Tuve el mismo problema, y ​​lo que hice fue su primera opción.

De todos modos, antes de agregarlos al mapa, cárguelos en un subproceso diferente, y después de que se hayan cargado todas las imágenes y datos, agréguelos al mapa en el subproceso principal.

0

Sugiero que almacene 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 es un conjunto, se eliminará el antiguo elemento de superposición.

Para mostrar los OverlayItems, utilice un ItemizedOverlay. En el método ItemizedOverlay.createItem(int position), puede obtener OverlayItem del conjunto. No olvide sobrescribir el método ItemizedOverlay.getSize() con return set.size().

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

Mire este Tutorial para obtener más información o haga un comentario si tiene alguna pregunta.

Cuestiones relacionadas