2017-11-11 1 views
0

Ich habe eine Liste von etwa 2000 Elemente meiner CustomClass, die LatLng als eines der Attribute hat. Also im Grunde möchte ich alle 2000 Marker auf der Karte fallen lassen, aber alle fallen lassen die Karte lückig machen. Also entschied ich mich, das Laden von Lazy für die Map zu implementieren. Ich habe eine HashMap, die Marker enthält, die im sichtbaren Bereich abgelegt werden. Unten ist, wie ich es implementiert habe.Drop-Marker auf neuen Thread

Ich iteriere über meine Liste und überprüfe, ob die LatLng Koordinaten des Gegenstands im sichtbaren Bereich liegen. Ich mache das mit LatLngBounds.contains() Methode. Wenn die Koordinaten des Objekts im sichtbaren Bereich liegen, lasse ich den Marker fallen und füge ihn der HashMap hinzu. Wenn sich die Koordinaten eines Objekts nicht im sichtbaren Bereich befinden, sollte es nicht auf der Karte sein und ich entferne es aus der Karte, wenn es dort ist.

Below-Code ist in onCameraIdleListener() und wird ausgeführt, jedes Mal die Karte verschoben oder zoommed in/out

for (Event event: listOfEvents) { 
    LatLng latLng = event.getCoordinates(); 
    LatLngBounds bounds = mMap.getProjection().getVisibleRegion().latLngBounds; 
    boolean isMarkerOnMap = markerksOnMap.contains(latLng); 
    if bounds.contains(latLng) { 
     if (!isMarkerOnMap) { 
      // add marker 
      markersOnMap.add(latLng); 
     } 
    } 
    else if (isMarkerOnMap) { 
     // remove marker 
     markersOnMap.remove(latLng); 
    } 
} 

Dieser Code oben funktioniert, aber meine Karte ist noch laggy. Was passiert, wenn die Karte verschoben wird, iteriert die for-Schleife über die 2000 Elemente und es dauert ein paar Sekunden, bis die Schleife verarbeitet ist. Während das geschieht, friert die Karte ein und ich kann die Karte nicht verschieben oder hinein- oder herauszoomen.

Sollte ich die for-Schleife in einem asynchronen Thread setzen? Jeder Beispielcode würde geschätzt werden.

Antwort

0

Ich glaube, Sie von der Asynchron-Mechanismus verwenden können (AsyncTask/Thread/rxjava) nur für bevölkern alle Marker

so, wenn Add erzeugte Markierung der markersOnMap (es den Haupt-Thread passieren) löschen Sie einfach alle Marker und ersetzen sie aus dem Ergebnis des Prozesses async

Beispiel auf AsyncTask():

class GenerateMarkerTask extends AsyncTask(List<Event>, Integer, List<Marker>) { 

protected List<Marker> doInBackground(List<Event>... events) { 
    List<Marker> markers = new ArrayList(); 
    for (Event event: listOfEvents) { 
     LatLng latLng = event.getCoordinates(); 
     LatLngBounds bounds = mMap.getProjection().getVisibleRegion().latLngBounds; 
     boolean isMarkerOnMap = markerksOnMap.contains(latLng); 
      if bounds.contains(latLng) { 
       if (!isMarkerOnMap) { 
        // add marker 
        markers.add(latLng); 
       } 
      } 
    } 

} 

protected void onPostExecute(List<Marker> result) { 
    markerksOnMap.clear(); 
    for (Marker marker: result) { 
     markersOnMap.add(result); 
    } 

} 

} 

dann auf onCameraIdleListener() laufen nur

012.
new GenerateMarkerTask.execute(listOfEvents); 
Verwandte Themen