6

Podczas pracy ViewHolder of GoogleMap Lite, jako część wiersza w RecyclerView, szukam wywołania zwrotnego, aby ustawić lokalizację szpilek, gdy mapa jest gotowa. Znalazłem obie funkcje poniżej.OnMapLoadedCallback i OnMapReadyCallback, kiedy użyć?

  1. OnMapLoadedCallback: https://developers.google.com/android/reference/com/google/android/gms/maps/GoogleMap.OnMapLoadedCallback?hl=en

  2. OnMapReadyCallback: https://developers.google.com/android/reference/com/google/android/gms/maps/OnMapReadyCallback

Zarówno również okazały roboczego i użyteczność (patrz poniżej). Dlatego jestem zaintrygowany, jeśli mają jakieś specyficzne zachowanie, które powinno być stosowane przy innej okazji, czy są one rzeczywiście podobne i mogą być stosowane zamiennie?

Zastosowanie OnMapLoadedCallback:

LatLngBounds.Builder builder = new LatLngBounds.Builder(); 
    for (Marker marker : markers) { 
     builder.include(marker.getPosition()); 
    } 

    final CameraUpdate cameraUpdate = CameraUpdateFactory.newLatLngBounds(builder.build(), 0); 
    googleMap.setOnMapLoadedCallback(new GoogleMap.OnMapLoadedCallback() { 
     @Override 
     public void onMapLoaded() { 
      googleMap.moveCamera(cameraUpdate); 
     } 
    }); 

Zastosowanie OnMapReadyCallback:

LatLngBounds.Builder builder = new LatLngBounds.Builder(); 
    for (Marker marker : markers) { 
     builder.include(marker.getPosition()); 
    } 

    final CameraUpdate cameraUpdate = CameraUpdateFactory.newLatLngBounds(builder.build(), 0); 
    mapView.getMapAsync(new OnMapReadyCallback() { 
     @Override 
     public void onMapReady(GoogleMap googleMap) { 
      googleMap.moveCamera(cameraUpdate); 
     } 
    }); 

Dzięki !!

+1

dzięki, że zadał pytanie, szukałem tego samego :) –

Odpowiedz

6

Możesz bezpiecznie używać OnMapReadyCallback do ustawiania sworzni. Jest wywoływana, gdy tylko mapa jest gotowa do użycia.

OnMapLoadedCallback, jako stan docs, nazywa

gdy mapa zakończeniu renderowania. Dzieje się tak, gdy wszystkie płytki są wymagane do renderowania mapy, a wszystkie etykiety są zakończone .

np. zawartość mapy jest w pełni załadowana i widoczna.

Następuje później niż OnMapReady. Nie widzę powodu, aby czekać na to wydarzenie.

EDIT: Wezwanie googleMap.setOnMapLoadedCallback nawet sugeruje, że OnMapReady już się stało, aby móc nazwać bezpiecznie (googleMap != null).

+1

Dzięki Ascorbin. na pewno dobrze jest użyć tego, który jest gotowy wcześniej. W jakim scenariuszu używalibyśmy OnMapLoadedCallback? – Elye

+1

@ Elye Nie wiem, być może ktoś mógłby pokazać pasek postępu, dopóki mapa nie załaduje się całkowicie lub nie ukryje mapy i nie przejdzie fantazyjnego zanikania w animacji po załadowaniu mapy. – FWeigl

+0

możesz napotkać problemy, jeśli polegasz tylko na oddzwanianiu onMapReady, jak podano tutaj: https://stackoverflow.com/questions/13692579/movecamera-with-cameraupdatefactory-newlatlngbounds-crashes – Analizer

2

co dokumentacja Google mówi:

1. OnMapLoadedCallback:

Wywoływana, gdy mapa zakończeniu renderowania. Zostanie on tylko raz nazwany . Musisz poprosić o ponowne odebranie połączenia, jeśli chcesz ponownie otrzymać powiadomienie .

Tak więc, w tym trzeba sprawdzić czy Kalkulacja jest null lub nie. Jeśli null, musisz go zainicjować. Wszystkie kafelki mapy zostały wyrenderowane i wszystkie etykiety zostały również ukończone zgodnie z definicją w dokumencie.

2.OnMapReadyCallback:

raz na przykład ten interfejs jest na MapFragment lub MapView obiektu, przy czym sposób onMapReady (GoogleMap) jest uruchamiany, kiedy mapa jest gotowe do użycia i zapewnia niezerowym wystąpienie GoogleMap.

Tak więc, w tym nie masz celu sprawdzenia zerową w onMapReady() metody.

+0

Dzięki @Clairvoyant. "To będzie wywoływane tylko raz dla' setOnMapLoadedCallback' jest szczególnie prawdziwe. Inną obserwowaną obserwacją jest to, że jeśli zrobię szybkie przewijanie na moim recyclerview przed załadowaniem działania, wersja 'setOnMapLoadedCallback' może nie poradzić sobie z kamerą map, ale funkcja 'OnMapReadyCallback' działa idealnie.Myślę, że szybkie przewijanie przed ładowaniem działania w jakiś sposób ustawiło MapAsLoaded przed kamerą.Tak więc nie udało się w końcu ruszyć. Krótko mówiąc, moim zaleceniem jest teraz użycie OnMapReadyCallback, jeśli mapa jest używana jako ViewHolder w RecyclerView – Elye

+0

Moim zdaniem ** OnMapReadyCallback ** jest lepszy także dlatego, że nie musimy sprawdzać ** stanu ** null dla mapy google – Pankaj

0

Pomiędzy połączeniami OnMapReadyCallback i OnMapLoadedCallback występuje luka. W tej mapie szczelin nie ma już wartości zerowej, ale jej części nie można w końcu zainicjować. W bardzo rzadkich sytuacjach można uzyskać IllegalStateException po wykonaniu niektórych metod po OnMapReadyCallback i przed OnMapLoadedCallback. Na przykład ruchoma kamera z mapą może spowodować to przez map.moveCamera lub map.animateCamera.

Ale z drugiej strony oczekiwanie na OnMapLoadedCallback jest przedłużeniem inicjalizacji mapy i użytkownik może to zobaczyć. Zdecydowałem się użyć takiego podejścia

mapFragment.getMapAsync(new OnMapReadyCallback() 
     { 
      @Override 
      public void onMapReady(GoogleMap googleMap) 
      { 
       try { 
        setUpMap(); 
       } 
       catch (IllegalStateException e) 
       { 
        map.setOnMapLoadedCallback(new GoogleMap.OnMapLoadedCallback() 
        { 
         @Override 
         public void onMapLoaded() { 
          setUpMap(); 
         } 
        }); 
       } 
      } 
     }); 
+0

Nie dostaję IllegalStateException, wszystkie Rozumiem, że to com.google.maps.api.android.lib6.common.apiexception. Może to zmienili. – Analizer

Powiązane problemy