Aktualisieren viele Google-Map-Marker-position, ohne aktualisieren Sie die gesamte Karte in Android

Ich bin derzeit an der Entwicklung einer Android-app, die zum empfangen von GPS-Positionen von anderen Geräten, jede Minuten, und auf einer Landkarte anzuzeigen.
Ich bin mit der GoogleMaps Api V2,

Was ich tun möchte, ist zu aktualisieren, die position der marker sehr viel Zeit in eine neue position empfangen wird. (Ich will nicht zu aktualisieren, die gesamte Karte)

Für den moment, ich habe einen button in dem Menü, das es mir ermöglicht, aktualisieren Sie die gesamte Karte.

Zum detail der Struktur, ich habe einen Dienst laufen, MQTT, und jedes mal, wenn eine position empfangen wird, füge ich es in eine Hashmap, das stellt meine Karte Datenquelle.
Diese HashMap ist ein Singleton, erstreckt sich Beobachten.
Außerdem, mein fragment, das display der my implementiert Observer.

Code von meinem Fragment implements Observer

 public void update(Observable observable, final Object object)
 {

     if (observable instanceof ListPositions && object != null)
     {        
         Position p = (Position) object;
         LatLng position = new LatLng(p.getLatitude(), p.getLongitude());
         //Where i'd like to move the markers

     }
     else
     {
        //Where i'd like to remove the marker from the map
     }
 }

Code Aus meiner Singleton-Liste der position

public class ListPositions extends Observable{

private HashMap<String,Position> mapPosition;

private ListPositions()
{
    mapPosition = new HashMap<String, Position>();
    VehicleMapFragment mapFragmentObserver = new VehicleMapFragment();
    this.addObserver(mapFragmentObserver);
}


private static ListPositions INSTANCE = null;


public static synchronized ListPositions getInstance()
{
    if (INSTANCE == null)
    { INSTANCE = new ListPositions();
    }
    return INSTANCE;
}

public int getNumberOfPosition()
{
    return mapPosition.size();
}

public void addPosition(String key, Position p){
    mapPosition.put(key,p);
    setChanged();
    notifyObservers(p);
}

public void removePosition(String key){
    mapPosition.remove(key);
    setChanged();
    notifyObservers();
}

Code Von myService läuft MQTT

public void onPositionMessageReceived(MqttMessage message, String source)
 {
    Gson gson = new Gson();
    String s = gson.toJson(message.toString());
    String jsonPosition = gson.toJson(message.toString());
    jsonPosition = formatMessage(jsonPosition);
    Position p = gson.fromJson(jsonPosition, Position.class);

    ListPositions.getInstance().addPosition(source, p);


}

Kann jemand wissen, wie sich zu bewegen jeden Marker einzeln ohne Aktualisierung der gesamten Karte, in meinem update-Funktion von meinem Beobachter-Fragment?
Darf ich mit einem Handler, um die Karte zu aktualisieren, aus einem anderen thread ändern Sie die Main-UI-Thread ?

Vielen Dank

EDIT :

Da die erste methode gegeben, die von AniV hat bei mir nicht funktioniert, ich habe versucht mit einem Asyntask, die ausgeführt wird, wenn mein Beobachter eine Benachrichtigung erhalten, aus der Beobachten-Liste.

Code aus der Beobachter-Fragment :

public void update(Observable observable, final Object object)
{
    if (observable instanceof ListPositions && object != null)
    {
        Position p = (Position) object;

        position = new LatLng(p.getLatitude(), p.getLongitude());
        options = new MarkerOptions().position(position).title("TEST").snippet("TEST");

        PositionUpdate positionUpdaterTask = new PositionUpdate(myGoogleMap, options, position);
    positionUpdaterTask.execute();
    }
}

Code aus dem AsyncTask :

public class PositionUpdate extends AsyncTask<Void, Void, Void>{

private GoogleMap myGoogleMap;
private MarkerOptions options;
private LatLng positionToAdd;


public PositionUpdate(GoogleMap googleMap, MarkerOptions options, LatLng position)
{
    this.myGoogleMap = googleMap;
    this.options = options;
    this.positionToAdd = position;
}


@Override
protected Void doInBackground(Void...voids)
{
    return null;
}

@Override
protected void onPostExecute(Void aVoid)
{
    if (myGoogleMap != null)
    {
        myGoogleMap.addMarker(options.position(positionToAdd));
        Log.i(ConstElisa.LOG_ELISA, "MARKER ADDED");
    }
    else
    {
        Log.e(ConstElisa.LOG_ELISA, "ERROR ADDING THE MARKER");
    }

    super.onPostExecute(aVoid);
}

In diesem Fall jedoch, myGoogleMap variable immer null ist, so wird die Marke nie Hinzugefügt, um die Google-Karte.

Hat jemand eine Idee, warum diese variable null ist ?

InformationsquelleAutor QuentR | 2015-03-07
Schreibe einen Kommentar