2016-05-06 5 views
-1

In meinem Projekt muss ich jedes Fahrzeug über Google Map verfolgen. In diesem Fall muss ich die Markerposition nach 1 Minute von mir aktualisieren. Aber mein Problem ist, dass jedes Mal, wenn die Google Map aktualisiert wird. Hier ist mein Code:Wie aktualisiert Google Map ohne Neuladen in Android?

public class MapsActivity extends FragmentActivity { 

private GoogleMap mMap; 

String json_string; 
JSONObject mJSONObject; 
JSONArray mJSONArray; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_maps); 

    json_string = getIntent().getExtras().getString("json_data"); 
    mMap = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map)) 
      .getMap(); 


    try { 
     mJSONObject = new JSONObject(json_string); 
     mJSONArray = mJSONObject.getJSONArray("server_response"); 

     String lat,lon,imei; 

     for(int i=0;i<mJSONArray.length();i++) { 
      JSONObject jo = mJSONArray.getJSONObject(i); 
      imei = jo.optString("IMEI"); 
      lat = jo.optString("Lattitude"); 
      lon = jo.optString("Longitude"); 

      setUpMapIfNeeded(imei,lat,lon); 

     } 
    } catch (JSONException e) { 
     e.printStackTrace(); 
    } 


    } 

private void setUpMapIfNeeded(String imei, String lat, String lon) { 

     if (mMap != null) { 
      double currentLatitude = Double.parseDouble(lat); 
      double currentLongitude = Double.parseDouble(lon); 
      LatLng latLng = new LatLng(currentLatitude, currentLongitude); 
      CameraPosition cameraPosition = new CameraPosition.Builder().target(
        new LatLng(currentLatitude, currentLongitude)).zoom(18).build(); 
      MarkerOptions options = new MarkerOptions() 
        .position(latLng) 
        .title(imei); 
      mMap.addMarker(options); 
      mMap.getUiSettings().setMyLocationButtonEnabled(true); 
      mMap.getUiSettings().setZoomGesturesEnabled(true); 
      mMap.getUiSettings().setZoomControlsEnabled(true); 
      mMap.setBuildingsEnabled(false); 
      mMap.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition)); 

    } 
} 

}

Bitte helfen Sie mir, da ich nicht die Karte jedes Mal, wenn der Marker aktualisiert wurde wieder geladen werden soll.

Antwort

0

Ich denke, Sie müssen für das Symbol angeben:

MarkerOptions options = new MarkerOptions() 
       .position(latLng) 
       .icon(R.drawable.pin_stop) 
       .title(imei); 
     mMap.addMarker(options); 
1

Verwenden von Ereignissen ist vielleicht der einfachste Weg, diese Art der Sache zu tun.

Fügen Sie im Prinzip eine Bibliothek wie EventBus hinzu und aktualisieren Sie bei jeder neuen Positionsangabe in Ihrer onEvent() Methode Ihre Markerposition auf der Karte.

Der einfachste Weg wäre, zuerst die Karte zu löschen und dann den Marker wie beim ersten Mal hinzuzufügen. Du könntest eine private Methode haben, mit der du das neue Latitude und Longitude übergeben würdest, und dann die Map entsprechend aktualisieren lassen!

Ich hoffe, das gibt Ihnen eine Idee, wie Sie Ihr Problem lösen können!

EDIT

Ich gehe davon aus (lose), die Sie Gradle System bauen verwenden. Nun, in Ihrem build.gradle-Datei: in Ihre Abhängigkeiten Klausel fügen Sie diese:

compile 'org.greenrobot:eventbus:3.0.0' 

Dann erstellen Sie eine einfache Java-Klasse wie folgt aus:

public class VehicleLocationUpdatedEvent(){ 

    public void isLocationUpdated; 

    public VehicleLocationUpdatedEvent(boolean updated){ 
     this.isLocationUpdated = updated; 
    } 
} 

nächstes in Ihrem Map-Aktivität oder Fragment, Sie Sie müssen die folgenden Teile hinzufügen, um nach Updates von anderen Teilen der Anwendung zu suchen - insbesondere, wenn neue Standortdaten empfangen werden.

//inside onCreate ..... 
EventBus.getDefault().register(this); 

//inside onDestroy 
EventBus.getDefault().unregister(this); 


//inside the activity, like any other method add this: 
public void onEvent(VehicleLocationUpdatedEvent event){ 

    if(event.isLocationUpdated){ 

     //call your method that actually updates the marker position 
     //this could simply be animating the camera to the new position 
     //like I said, clear the map of the old marker if you want 
    } 
} 

Nun tatsächlich dieses Ereignis verwenden, müssen Sie es schreiben, wenn Sie die neue Standortdaten erhalten - wie Breite und Länge. Sie können die Ereignisklasse sogar so ändern, dass sie Werte für den Breiten- und den Längengrad enthält, damit Sie sie griffbereit haben.

//to call the post method, simply do this 
EventBus.getDefault().post(new VehicleLocationUpdatedEvent(true)); 

Das ist alles, was Sie brauchen, um Ereignisse in Android zu verwenden! Ich hoffe das hilft.

+0

Können Sie ein Beispiel geben? –

+0

Überprüfen Sie meinen aktualisierten Code – Eenvincible

+0

Wer downn-Stimmen, bitte fügen Sie einen Kommentar, um einen Grund zu geben – Eenvincible