Atualizar e reprocessar objetos em um mapa

Você deve atualizar frequentemente informações sobre um objeto mapeável e reprocessá-lo em um mapa. Por exemplo, nome, descrição ou coordenadas de um objeto MapLocation podem ser alterados, ou você talvez deseje alterar a aparência de um item em um mapa em resposta a uma ação do usuário de aparelho BlackBerry. Também é recomendável exibir a localização de um contato do usuário do BlackBerry Messenger e atualizar o mapa conforme a localização muda. Ao criar uma classe que implementa a interface DynamicMappable, você pode criar objetos mapeáveis que são atualizados dinamicamente em um mapa quando eles se alteram. Além da classe DynamicMappable, o pacote net.rim.device.api.lbs.maps.model contém o seguinte conjunto de classes que permite a você criar objetos dinâmicos mapeáveis.

Classe ou interface

Descrição

DynamicMappable

Ao implementar esta interface em uma classe que você cria, você pode criar objetos mapeáveis com propriedades alteráveis que podem ser atualizadas dinamicamente em um mapa.

MappableEventManager

Quando você cria uma classe que implementa DynamicMappable, deve implementar o método getMappableEventManager, que retorna um objeto desta classe. Esta classe gerencia os eventos e ouvintes para objetos dinâmicos mapeáveis e inicia atualizações a mapas.

MappableEventListener

Você pode usar esta interface para ouvir alterações de um objeto dinâmico mapeável.

MappableChangeEvent

Quando você desejar ativar atualizações em um mapa, poderá criar uma instância desta classe que capture o conteúdo de um evento de alteração que tenha ocorrido com um objeto dinâmico mapeável.

Para criar um objeto dinâmico mapeável, você deve criar uma classe que implemente a interface DynamicMappable. Esta classe armazena o estado antigo e o estado novo de todas as informações que podem ser alteradas. Por exemplo, se seu aplicativo exibir os preços do combustível em vários postos, sua classe dinâmica mapeável armazenará os preços novos e antigos.

Sua classe dinâmica mapeável deve implementar o método getEventManager. Quando você chama getEventManager de seu aplicativo principal, o método retorna um objeto MappableEventManager. Depois que você adiciona um objeto dinâmico mapeável a um mapa, o objeto MappableEventManager é o componente que notifica o mapa quando uma alteração ocorre, forçando-o a reprocessar o objeto. Para iniciar a atualização, você deve criar e disparar um MappableChangeEvent que contenha o estado antigo e o estado novo do conteúdo que está alterando.

Criar uma classe que implemente DynamicMappable

O exemplo de código a seguir demonstra como criar uma classe que pode atualizar a localização de um objeto em um mapa. A classe é chamada UpdatableMappable e estende a classe MapLocation implementando o DynamicMappable. No construtor UpdatableMappable, o super() é chamado para inicializar o objeto da mesma maneira como um objeto MapLocation é inicializado. Além disso, a propriedade MappableEventManager, necessária para implementar a interface DynamicMappable, é inicializada. É essa instância do MappableEventManager que habilita a classe UpdatableMappable a enviar atualizações sobre si ao mapa ao qual você a adicionou.

Esta classe também substitui setLon() e setLat() . Quando você chama um destes métodos de seu aplicativo, o método obtém a latitude ou a longitude existente e a armazena como um valor antigo antes que a classe chame super para definir o novo valor.

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

Adicionar um objeto dinâmico mapeável a um mapa

O exemplo de código a seguir demonstra como criar um objeto RichMapField e adicionar um objeto dinâmico mapeável ao modelo de dados do 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);

Atualizar o objeto dinâmico mapeável

O exemplo de código a seguir demonstra como definir os novos valores para a latitude e a longitude do objeto dinâmico mapeável e iniciar uma atualização para reprocessar o objeto no mapa. Você pode definir os novos valores para a latitude e a longitude chamando o UpdatableMappable.setLat() e o UpdatableMappable.setLon(). Para enviar as atualizações ao mapa, você pode chamar UpdatableMappable.getEventManager() e disparar um MappableChangeEvent, que contém o novo estado e o antigo estado do objeto.

Neste exemplo, o estado antigo é representado por um MapPoint que contém as coordenadas antigas. O novo estado é uma referência ao objeto atualizado mapeável. Em casos em que objetos dinâmicos mapeáveis são freqüentemente atualizados com novas informações (como quando você rastreia uma localização quase que em tempo real), um objeto dinâmico mapeável pode ser substituído por valores novos antes que o gerenciador de eventos dispare um evento. Nesses casos, você pode criar e enviar uma cópia do objeto para assegurar que todas as atualizações sejam reprocessadas no mapa.

As variáveis newLat e newLon representam as novas coordenadas do objeto dinâmico mapeável, que são obtidas por uma operação separada (por exemplo, uma solicitação que você envia para uma localização do usuário, ou um serviço Web que envia informações de localização).

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

Estas informações foram úteis? Gostaríamos de receber seus comentários.