Aggiornamento e riesecuzione del rendering degli oggetti su una mappa

Spesso, è necessario aggiornare le informazioni su un oggetto mappabile e rieseguire il rendering dell'oggetto su una mappa. Ad esempio, il nome, la descrizione o le coordinate di un oggetto MapLocation potrebbero cambiare o potrebbe essere necessario modificare l'aspetto di un elemento su una mappa a seguito di un'azione dell'utente BlackBerry. Inoltre, si potrebbe desiderare di visualizzare la posizione di un contatto BlackBerry Messenger di un utente e aggiornare la mappa man mano che la posizione del contatto cambia. Creando una classe che implementa l'interfaccia DynamicMappable, è possibile creare oggetti mappabili che vengono aggiornati dinamicamente su una mappa ogni volta che il loro stato cambia. Oltre alla classe DynamicMappable, il pacchetto net.rim.device.api.lbs.maps.model contiene la serie di classi riportata di seguito, che consente di creare oggetti mappabili dinamici.

Classe o interfaccia

Descrizione

DynamicMappable

Implementando questa interfaccia su una classe creata, è possibile creare oggetti mappabili con proprietà variabili che possono essere aggiornati dinamicamente su una mappa.

MappableEventManager

Quando viene creata una classe che implementa DynamicMappable, è necessario implementare il metodo getMappableEventManager, che restituisce un oggetto di questa classe. Questa classe gestisce gli eventi e i listener per gli oggetti mappabili dinamici e avvia gli aggiornamenti da inviare alle mappe.

MappableEventListener

È possibile utilizzare questa interfaccia per rilevare i cambi di stato dell'oggetto mappabile dinamico.

MappableChangeEvent

Per inviare gli aggiornamenti a una mappa, è possibile creare un'istanza di questa classe per acquisire i contenuti di un evento di modifica che si è verificato con un oggetto mappabile dinamico.

Per creare un oggetto mappabile dinamico, è necessario creare una classe che implementa l'interfaccia DynamicMappable. Questa classe memorizza lo stato precedente e il nuovo stato per tutte le informazioni che è possibile modificare. Ad esempio, se l'applicazione visualizza i prezzi della benzina in varie stazioni di servizio, la classe mappabile dinamica memorizza il vecchio e il nuovo prezzo della benzina.

La classe mappabile dinamica deve implementare il metodo getEventManager. Quando si richiama getEventManager dall'applicazione principale, il metodo restituisce un oggetto MappableEventManager. Dopo aver aggiunto un oggetto mappabile dinamico a una mappa, l'oggetto MappableEventManager è il componente che notifica alla mappa il momento in cui si verifica una modifica, forzando la mappa a rieseguire il rendering dell'oggetto. Per avviare l'aggiornamento, è necessario creare e attivare un elemento MappableChangeEvent che contiene lo stato precedente e il nuovo stato per il contenuto in fase di modifica.

Creazione di una classe che implementa DynamicMappable

L'esempio di codice seguente mostra come creare una classe che può aggiornare la posizione di un oggetto su una mappa. La classe denominata UpdatableMappable estende la classe MapLocation e implementa il metodo DynamicMappable. Nel costruttore UpdatableMappable, viene richiamato super() per inizializzare l'oggetto allo stesso modo di un oggetto MapLocation. Inoltre, viene inizializzata la proprietà MappableEventManager richiesta per implementare l'interfaccia DynamicMappable. Questa istanza di MappableEventManager consente alla classe UpdatableMappable di inviare i propri aggiornamenti alla mappa a cui viene aggiunta.

Inoltre, questa classe sovrascrive setLon() e setLat(). Quando si richiama uno di questi metodi dall'applicazione, il metodo rileva la latitudine o la longitudine esistente e la memorizza come valore precedente prima che la classe richiami super per impostare un nuovo valore.

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;
    }
}

Aggiunta di un oggetto mappabile dinamico a una mappa

L'esempio di codice seguente mostra come creare un oggetto RichMapField e aggiungere un oggetto mappabile dinamico al modello di dati della mappa.

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);

Aggiornamento di un oggetto mappabile dinamico

L'esempio di codice seguente mostra come impostare i nuovi valori per la latitudine e la longitudine dell'oggetto mappabile dinamico e come effettuare un aggiornamento per rieseguire il rendering dell'oggetto su una mappa. È possibile impostare i nuovi valori per la latitudine e la longitudine richiamando UpdatableMappable.setLat() e UpdatableMappable.setLon(). Per inviare gli aggiornamenti alla mappa, è possibile richiamare UpdatableMappable.getEventManager() e attivare un evento MappableChangeEvent, che contiene sia il nuovo stato che lo stato precedente dell'oggetto.

In questo esempio, lo stato precedente è rappresentato da un elemento MapPoint, che contiene le coordinate precedenti. Il nuovo stato è un riferimento all'oggetto mappabile aggiornato. Nei casi in cui gli oggetti mappabili dinamici vengano aggiornati frequentemente con nuove informazioni (ad esempio, per il rilevamento di una posizione quasi in tempo reale), è possibile sovrascrivere un oggetto mappabile dinamico con i nuovi valori prima che il gestore eventi possa attivare un evento. In questi casi, potrebbe essere necessario creare e inviare una copia dell'oggetto per assicurarsi che sia stato rieseguito il rendering di tutti gli aggiornamenti sulla mappa.

Le variabili newLat e newLon rappresentano le nuove coordinate per l'oggetto mappabile dinamico, ottenute tramite un'operazione separata (ad esempio, una richiesta inviata per la posizione di un utente o un servizio Web che invia le informazioni sulla posizione).

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 informazioni sono state utili? Inviateci i vostri commenti.