Aktualisierung und Neudarstellung von Objekten auf einer Karte

Es ist häufig erforderlich, Informationen zu einem abbildbaren Objekt zu aktualisieren und das Objekt auf einer Karte neu darzustellen. Zum Beispiel können Name, Beschreibung oder Koordinaten eines MapLocation-Objekts sich ändern, oder Sie möchten die Darstellung eines Elements auf einer Karte als Reaktion auf die Aktion eines BlackBerry-Gerätebenutzers ändern. Sie möchten u. U. den Standort eines BlackBerry Messenger-Kontakts eines Benutzers anzeigen und die Karte aktualisieren, wenn der Standort sich ändert. Durch Erstellen einer Klasse, die die DynamicMappable-Schnittstelle implementiert, können Sie abbildbare Objekte erstellen, die dynamisch auf einer Karte aktualisiert werden, wenn sie sich ändern. Zusätzlich zur DynamicMappable-Klasse enthält das net.rim.device.api.lbs.maps.model-Paket den folgenden Satz von Klassen, mit dem Sie dynamische abbildbare Objekte erstellen können.

Klasse oder Schnittstelle

Beschreibung

DynamicMappable

Durch Implementieren dieser Schnittstelle in einer von Ihnen erstellten Klasse können Sie abbildbare Objekte mit veränderlichen Eigenschaften erstellen, die dynamisch auf einer Karte aktualisiert werden können.

MappableEventManager

Wenn Sie eine Klasse erstellen, die DynamicMappable implementiert, muss sie die getMappableEventManager-Methode implementieren, die ein Objekt dieser Klasse zurückgibt. Diese Klasse verwaltet die Ereignisse und Listener für dynamische abbildbare Objekte und initiiert Kartenaktualisierungen.

MappableEventListener

Sie können diese Schnittstelle verwenden, um Änderungen an einem dynamischen abbildbaren Objekt abzufragen.

MappableChangeEvent

Wenn Sie Aktualisierungen für eine Karte pushen möchten, können Sie eine Instanz dieser Klasse erstellen, die die Inhalte eines Änderungsereignisses aufzeichnet, das für ein dynamisches abbildbares Objekt aufgetreten ist.

Um ein dynamisches abbildbares Objekt zu erstellen, müssen Sie eine Klasse erstellen, die die DynamicMappable-Schnittstelle implementiert. Diese Klasse speichert den alten und neuen Zustand für alle Informationen, die sich ändern können. Wenn Ihre Anwendung z. B. Benzinpreise an verschiedenen Tankstellen anzeigt, speichert Ihre dynamische abbildbare Klasse den alten und neuen Benzinpreis.

Ihre dynamische abbildbare Klasse muss die getEventManager-Methode implementieren. Wenn Sie getEventManager von Ihrer Hauptanwendung aus aufrufen, gibt die Methode ein MappableEventManager-Objekt zurück. Nachdem Sie ein dynamisches abbildbares Objekt zu einer Karte hinzugefügt haben, ist das MappableEventManager-Objekt die Komponente, die die Karte benachrichtigt, wenn eine Änderung auftritt, und daraufhin die Karte zwingt, das Objekt neu darzustellen. Um die Aktualisierung zu initiieren, müssen Sie ein MappableChangeEvent erstellen und auslösen, das den alten und neuen Zustand für den Inhalt enthält, der sich ändert.

Erstellen einer Klasse, die DynamicMappable implementiert

Das folgende Codebeispiel zeigt, wie Sie eine Klasse erstellen, die den Standort eines Objekts auf einer Karte aktualisieren kann. Die Klasse heißt UpdatableMappable. Sie erweitert die MapLocation-Klasse und implementiert DynamicMappable. Im UpdatableMappable-Konstruktor wird super() aufgerufen, um das Objekt auf die gleiche Art und Weise wie ein MapLocation-Objekt zu initialisieren. Es wird die MappableEventManager-Eigenschaft initialisiert, die erforderlich ist, um die DynamicMappable-Schnittstelle zu implementieren. Diese Instanz des MappableEventManager ermöglicht der UpdatableMappable-Klasse die an ihr vorgenommenen Aktualisierungen mittel Push auf die Karte bereitzustellen, der Sie die Klasse hinzugefügt haben.

Diese Klasse hebt zudem setLon() und setLat() auf. Wenn Sie eine dieser Methoden von Ihrer Anwendung aus aufrufen, nimmt die Methode die vorhandene Breite oder Länge und speichert sie als alten Wert, bevor die Klasse super aufruft, um den neuen Wert zu bestimmen.

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

Hinzufügen eines dynamischen abbildbaren Objekts zu einer Karte

Das folgende Codebeispiel zeigt, wie Sie ein RichMapField-Objekt erstellen und ein dynamisches abbildbares Objekt zum Datenmodell der Karte hinzuzufügen.

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

Aktualisieren des dynamischen abbildbaren Objekts

Das folgende Codebeispiel zeigt, wie Sie die neuen Werte für die Breite und Länge des dynamischen abbildbaren Objekts festlegen und eine Aktualisierung zur Neudarstellung des Objekts auf einer Karte initiieren. Sie können die neuen Werte für die Breite und Länge durch Aufrufen von UpdatableMappable.setLat() und UpdatableMappable.setLon() festlegen. Um die Aktualisierungen auf einer Karte mittels Push bereitzustellen, können Sie UpdatableMappable.getEventManager() aufrufen und ein MappableChangeEvent auslösen, das sowohl den neuen als auch den alten Zustand des Objekts enthält.

In diesem Beispiel wird der alte Zustand von einem MapPoint dargestellt, der die alten Koordinaten enthält. Der neue Zustand referenziert das aktualisierte abbildbare Objekt. Wenn dynamische abbildbare Objekte oft mit neuen Informationen aktualisiert werden (z. B. wenn Sie einen Standort nahezu in Echtzeit verfolgen), kann ein dynamisches abbildbares Objekt mit neuen Werten überschrieben werden, bevor der Ereignismanager ein Ereignis auslösen kann. In diesen Fällen sollten Sie eine Kopie des Objekts erstellen und senden, um sicherzustellen, dass alle Aktualisierungen auf der Karte neu dargestellt werden.

Die Variablen newLat und newLon stellen die neuen Koordinaten des dynamischen abbildbaren Objekts dar, die durch einen separaten Vorgang abgerufen werden (z. B. eine Anforderung, die Sie für den Standort eines Benutzers senden, oder ein Webdienst, der Standortinformationen im Push-Verfahren bereitstellt).

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

Waren diese Informationen hilfreich? Senden Sie uns Ihren Kommentar.