Actualizar y volver a generar objetos en un mapa

Debe actualizar frecuentemente la información sobre un objeto asignable y volver a generar el objeto en un mapa. Por ejemplo, el nombre, la descripción o las coordenadas de un objeto MapLocation podrían cambiar o quizás desee cambiar la apariencia de un elemento en un mapa en respuesta a la acción del usuario de un dispositivo BlackBerry. Puede que desee mostrar la ubicación de un contacto de BlackBerry Messenger de un usuario y actualizar el mapa a medida que la ubicación cambie. Al crear una clase que implemente la interfaz DynamicMappable, puede crear objetos asignables que se actualicen de forma dinámica en un mapa cuando cambien. Además de la clase DynamicMappable, el paquete net.rim.device.api.lbs.maps.model contiene el siguiente conjunto de clases que le permiten crear objetos asignables dinámicos.

Clase o interfaz

Descripción

DynamicMappable

Al implementar esta interfaz en una clase que cree, puede crear objetos asignables con propiedades cambiables que se puedan actualizar de forma dinámica en un mapa.

MappableEventManager

Cuando crea una clase que implementa DynamicMappable, ésta debe implementar el método getMappableEventManager, lo cual devuelve un objeto de esta clase. Esta clase gestiona los eventos y los servicios de escucha para los objetos asignables dinámicos e inicia las actualizaciones de mapas.

MappableEventListener

Puede utilizar esta interfaz para escuchar cambios en un objeto asignable dinámico.

MappableChangeEvent

Cuando desee insertar por push actualizaciones de un mapa, puede crear una instancia de esta clase que capture los contenidos de un evento de cambio que se haya producido con un objeto asignable dinámico.

Para crear un objeto asignable dinámico, debe crear una clase que implemente la interfaz DynamicMappable. Esta clase almacena el estado anterior y el estado nuevo de toda la información que puede cambiar. Por ejemplo, si su aplicación muestra los precios de la gasolina en varias gasolineras, su clase asignable dinámica almacenará el precio anterior y el nuevo de la gasolina.

Su clase asignable dinámica debe contener la implementación del método getEventManager. Cuando invoca getEventManager desde su aplicación principal, el método devuelve un objeto MappableEventManager. Una vez que ha agregado un objeto asignable dinámico a un mapa, el objeto MappableEventManager es el componente que notifica al mapa cuando se produce un cambio, y fuerza al mapa a volver a generar el objeto. Para iniciar la actualización, debe crear y activar un MappableChangeEvent que contenga el estado anterior y el nuevo estado del contenido que se cambia.

Crear una clase que implemente DynamicMappable

El siguiente ejemplo de código muestra cómo crear una clase que pueda actualizar la ubicación de un objeto en un mapa. La clase se llama UpdatableMappable, y amplía la clase MapLocation e implementa el DynamicMappable. En el constructor UpdatableMappable, se llama a super() para inicializar el objeto de la misma manera que se inicializa un objeto MapLocation. Además, la propiedad MappableEventManager necesaria para implementar la interfaz DynamicMappable se inicializa. Es esta instancia del MappableEventManager la que permite a la clase UpdatableMappable insertar por push actualizaciones sobre sí misma en el mapa al que la agrega.

Esta clase también omite setLon() y setLat(). Cuando llama a uno de estos métodos desde su aplicación, el método toma la latitud o la longitud existentes y la almacena como un valor anterior antes de que la clase invoque super para establecer el valor nuevo.

public class UpdatableMappable extends MapLocation implements DynamicMappable 
{    
    public MappableEventManager eventManager; 
    public double oldLat;
    public double oldLon;
    public UpdatableMappable(double lat, double lon, String name, String description) 
    {
        super(lat, lon, name, description);
        eventManager = new MappableEventManager();
    }
    public void setLon(final double lon) 
    {
        oldLon = getLon();
        super.setLon(lon);
    }
    public void setLat(final double lat) 
    {
        oldLat = getLat();
        super.setLat(lat);
    }
    public MappableEventManager getEventManager() 
    {
        return eventManager;
    }
}

Agregar un objeto asignable dinámico a un mapa

El siguiente ejemplo de código muestra cómo crear un objeto RichMapField y agregar un objeto asignable dinámico al modelo de datos del mapa.

RichMapField map = MapFactory.getInstance().generateRichMapField();
map.getMapField().getAction().setCenter(new MapPoint( 45.0, -75.0));
add(map);
UpdatableMappable mappableObject = new UpdatableMappable(45.0, -75.0, 
        "Map Location", "Dynamic Updates"); 
MapDataModel model = map.getModel();
model.add(mappableObject, "dynamic", true);

Actualizar el objeto asignable

El siguiente ejemplo de código muestra cómo establecer los valores nuevos de latitud y longitud del objeto asignable dinámico e iniciar una actualización para volver a generar el objeto en un mapa. Puede establecer los valores nuevos de latitud y longitud llamando al UpdatableMappable.setLat() y UpdatableMappable.setLon(). Para insertar por push las actualizaciones en el mapa, puede llamar a UpdatableMappable.getEventManager() y activar un MappableChangeEvent, que contiene tanto el estado nuevo como el anterior del objeto.

En este ejemplo, el estado anterior está representado por un MapPoint que contiene las coordenadas anteriores. El estado nuevo es una referencia al objeto asignable actualizado. En los casos en los que los objetos asignables dinámicos se actualicen frecuentemente con información nueva (como cuando rastrea una ubicación en tiempo casi real), es posible que un objeto asignable dinámico se sobrescriba con valores nuevos antes de que el gestor de eventos pueda activar un evento. En estos casos, puede desear crear y enviar una copia del objeto para asegurarse de que todas las actualizaciones se vuelvan a generar en el mapa.

Las variables newLat y newLon representan las nuevas coordenadas del objeto asignable dinámico, que se obtienen a través de una operación independiente (por ejemplo, una solicitud que envía para obtener la ubicación de un usuario o un servicio Web que inserta por push la información de ubicación).

mappableObject.setLat(newLat);
mappableObject.setLon(newLon);
MappableChangeEvent event = new MappableChangeEvent();
event.setOldState(new MapPoint(mappableObject.oldLat, mappableObject.oldLon));
event.setNewState(mappableObject);
mappableObject.getEventManager().triggerEvent(event);

¿Le ha resultado útil esta información? Envíenos sus comentarios.