Używam Map Google i narzędzia do tworzenia klastrów w mojej aplikacji. Samo klastrowanie działa dobrze, ale mam problem, kiedy próbuję radzić sobie ze zmianami konfiguracji.Android, oddzwonienie po zakończeniu grupowania map
To jest moja sprawa:
- użytkownik widzi na ekranie mapy, który jest
fragment
. - Po utworzeniu klastrów pojawiają się znaczniki na mapie. Użytkownik może wchodzić w interakcję z
markers
. - Gdy użytkownik wybierze , zostanie podświetlony, a rozszerzenie
BottomSheet
zostanie rozwinięte.
Jeśli użytkownik obraca ekranu (zdarza tj zmianę konfiguracji), zapisać co marker został wybrany za pomocą onSaveInstanceState
(właściwie nie zapisać sam znacznik, ale tylko link do powiązanej List
wpisu jak ID). Następnie chcę przywrócić ten wybór użytkownika, który był przed zmianą konfiguracji.
klastrowania sama jest wykonywany tak:
clusterManager.clearItems();
clusterManager.addItems(eventManager.getEventList());
clusterManager.cluster();
Ten kod jest wykonywany, gdy dane są odbierane z serwera. Podczas wykonywania klastrowania wszystkie oczywiście są również odtwarzane. Aby podkreślić poprzedni wybór użytkownika (poprzedni), muszę wiedzieć, GDY narzędzie do tworzenia klastrów zakończyło działanie. Do tego czasu jestem pewien, że mogę bezpiecznie korzystać z takich funkcji jak:
clusterManager.getRenderer()).getMarker(<param>)
i
clusterManager.getRenderer()).getClusterItem(<param>)
inaczej, to powróci null
czasami, jeśli zadanie grupowanie nie jest jeszcze zakończona.
Jednak nie można znaleźć rozsądnego sposobu, w jaki sposób uzyskać odpowiedź z narzędzia do grupowania (tj. ClusterManager
), gdy klastrowanie zostanie zakończone. Chyba trzeba aktualizować standardowy kod grupowania:
/**
* Runs the clustering algorithm in a background thread, then re-paints when results come back.
*/
private class ClusterTask extends AsyncTask<Float, Void, Set<? extends Cluster<T>>> {
@Override
protected Set<? extends Cluster<T>> doInBackground(Float... zoom) {
mAlgorithmLock.readLock().lock();
try {
return mAlgorithm.getClusters(zoom[0]);
} finally {
mAlgorithmLock.readLock().unlock();
}
}
@Override
protected void onPostExecute(Set<? extends Cluster<T>> clusters) {
mRenderer.onClustersChanged(clusters);
}
}
myślę, że onPostExecute
powinna udzielić odpowiedzi nie Renderer
tylko, ale do użytkownika ClusterManager
(jak moja fragment
), że tworzenie klastrów jest wykonywana. Ale nie chcę modyfikować standardowego kodu.
Czy istnieje lepszy sposób postępowania w tej sprawie?
Czy próbowali za pomocą 'OnMapLoadedCallback'? Zgodnie z dokumentacją (https://developers.google.com/android/reference/com/google/android/gms/maps/GoogleMap.OnMapLoadedCallback) funkcja 'onMapLoaded()' jest wywoływana po zakończeniu renderowania mapy – antonio
Cóż, to może być w porządku, ale problem polega na tym, że mogę rysować znaczniki i klastry zaraz po otrzymaniu danych z serwera, ale czasami mapa jest ładowana przed otrzymaniem danych (z powodu problemów z połączeniem itp.). Prawdopodobnie to nie zadziała. – rofl