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 ?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Habe ich endlich geschafft, das Ding mithilfe der AsyncTask.
In meinem EDIT, ich sagte, dass ich hatte einige Probleme mit dem null-Instanz von meinem Google Maps-Objekt.
Verursacht wurde dies durch meine Singleton zu Beobachten. In der Tat, in den Konstruktor, die ich verwendet
Diesen code neu erstellt eine weitere Instanz des Fragments, und dass der Grund, warum ii hatte Null-Objekte.
Um dieses problem zu beheben, habe ich einfach verwendet :
in meinem Fragment Beobachter.
Also, wenn Sie aktualisieren möchten, eine marker-position ohne Aktualisierung der ganzen map,
Sie können die Observer/Observable-Muster, und verwenden Sie einen Asynctask zur Aktualisierung der marker position.
Sie haben hier zwei Optionen:
Aktualisieren Sie entweder die marker-position Programm mithilfe der setPosition () - Methode.
Verwenden Sie dieses Objekt, um seine position zu ändern:
ODER, wie Sie sagte, Machen Sie Gebrauch von Handlern:
und onCreate()
Handler option ist besser, in Fällen, in denen Sie zur Aktualisierung der position in einem bestimmten Zeitintervall.
Ich habe so etwas wie dieses. Ich erhalte eine Liste der Geräte alle 5 Minuten zu aktualisieren, die Standorte von der Karte.
Was haltet Ihr von diesem
wenn der marker für ein Gerät mit x-id gefunden wird, in die HashMap Sie Ihre Position aktualisieren.