6

在使用GoogleMap Lite的ViewHolder時,作爲RecyclerView中行的一部分,我正在尋找回調以在Map準備就緒時設置引腳位置。我在下面找到了兩個函數。OnMapLoadedCallback和OnMapReadyCallback,什麼時候用哪個?

  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

兩個也被證明工作和使用(如下所示)。因此,如果他們有不同的行爲,應該在不同的場合使用,或者他們確實是相似的並且可以互換使用,我會感到困惑嗎?

使用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); 
     } 
    }); 

使用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); 
     } 
    }); 

謝謝!

+1

感謝你問我的問題,我一直在尋找同樣的:) –

回答

6

您可以放心地使用OnMapReadyCallback來設置您的針腳。只要地圖準備就緒,即可使用它。

OnMapLoadedCallback,作爲文檔狀態,是在地圖上呈現完畢稱爲

。這發生在渲染地圖所需的所有瓦片 都已獲取且所有標記完成後爲 。

例如,地圖的內容已完全加載並可見。

這發生在比OnMapReady晚。我沒有看到有理由等待這個事件。

編輯:呼叫googleMap.setOnMapLoadedCallback甚至暗示OnMapReady已經發生,以便能夠安全地(googleMap != null)調用。

+1

由於維他命C。使用準備就緒的軟件絕對是一件好事。那麼我們會在什麼情況下使用OnMapLoadedCallback? – Elye

+1

@Elye我不知道,也許有人可能會顯示一個ProgressBar,直到地圖完全加載或隱藏地圖,並在加載地圖時在動畫中做一些花哨的淡入淡出。 – FWeigl

+0

你可以面對的問題,如果你只依靠onMapReady回調如下所述:https://stackoverflow.com/questions/13692579/movecamera-with-cameraupdatefactory-newlatlngbounds-crashes – Analizer

2

由於谷歌文檔說:

1 OnMapLoadedCallback:

圖時已完成渲染調用。這隻會被稱爲 一次。如果您想要再次通知 ,您必須請求另一個回叫。

因此,在此您必須檢查是否谷歌地圖爲空或不是。如果爲null,那麼你必須初始化它。所有的地圖圖塊都已經被渲染,並且所有的標籤也按照文檔中的定義完成。

2。OnMapReadyCallback:

一旦該接口的一個實例被設定在一個MapFragment或MapView類 對象,則觸發onMapReady(GoogleMap的)方法時,在地圖上是 隨時可以使用,並提供了一個非空實例谷歌地圖。

所以,在這個你不必在onMapReady()方法來檢查

+0

謝謝@Clairvoyant。 「這隻會被調用一次''setOnMapLoadedCallback'特別真實。我觀察到的一個不同是,如果我在加載activity之前快速滾動我的recyclerview,'setOnMapLoadedCallback'版本可能無法移動地圖,但是'OnMapReadyCallback'完美地工作,我猜在活動加載之前的快速滾動已經在攝影機移動之前設置了MapAsLoaded,所以它最終沒有繼續前進。總之,我現在的建議是使用OnMapReadyCallback地圖用作RecyclerView中的ViewHolder – Elye

+0

在我的意見** OnMapReadyCallback **更好,因爲我們不必檢查谷歌地圖** null **條件。 – Pankaj

0

OnMapReadyCallbackOnMapLoadedCallback之間有一個差距。在這個差距圖中已經不是空的,但它的部分可能不會最終初始化。在非常罕見的情況下,在OnMapReadyCallback之後和OnMapLoadedCallback之後執行某些方法後,您可以獲得IllegalStateException。例如,移動地圖相機可能會導致它由map.moveCameramap.animateCamera

但另一方面,等待OnMapLoadedCallback延長您的地圖初始化,用戶可以看到這一點。 我已經決定使用這種方法

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

我沒有得到IllegalStateException,全部我看到的是com.google.maps.api.android.lib6.common.apiexception。也許他們改變了它。 – Analizer

相關問題