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.