OnMapLoadedCallback和OnMapReadyCallback,何时使用哪个?

时间:2015-09-04 07:40:06

标签: android google-maps android-recyclerview android-viewholder

在使用GoogleMap Lite的ViewHolder时,作为RecyclerView中行的一部分,我正在寻找回调来在Map准备就绪时设置引脚位置。我在下面找到了这两个功能。

  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

  3. 两者都经证明有效且可用(如下所示)。因此,我很困惑,如果他们确实有任何特定的不同行为应该在不同的场合使用,或者他们确实相似,可以互换使用?

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

    谢谢!

4 个答案:

答案 0 :(得分:6)

您可以安全地使用OnMapReadyCallback来设置您的引脚。只要地图准备就绪,您就可以使用它。

正如文档所述,

OnMapLoadedCallback被称为

  

地图完成渲染后。这发生在所有瓷砖之后   已经获取了渲染地图所需的所有标签   完整。

例如。地图的内容已完全加载且可见。

这比OnMapReady晚发生。我没有理由等待那件事。

编辑:电话googleMap.setOnMapLoadedCallback甚至意味着OnMapReady已经碰巧能够被安全地召唤(googleMap != null)。

答案 1 :(得分:2)

正如 Google文档所说:

<强> 1。 OnMapLoadedCallback:

  

地图完成渲染后调用。这只会被调用   一旦。如果您想收到通知,您必须请求另一个回调   试。

因此,您必须检查 googleMap是否为空。如果为null,则必须初始化它。所有地图图块都已呈现,所有标签也按照文档中的定义完成。

<强> 2。 OnMapReadyCallback:

  

在MapFragment或MapView上设置此接口的实例后   对象,地图时触发onMapReady(GoogleMap)方法   准备使用并提供GoogleMap的非null实例。

因此,您不必在 onMapReady()方法中检查 null

答案 2 :(得分:0)

OnMapReadyCallbackOnMapLoadedCallback的来电之间存在差距。在这个间隙图中已经不是空的,但它的部分可能最终没有被初始化。在极少数情况下,在IllegalStateException之后和OnMapReadyCallback之前执行某些方法后,您可以获得OnMapLoadedCallback。例如,移动地图相机可以通过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();
                        }
                    });
                }
            }
        });

答案 3 :(得分:-1)

OnMapLoadedCallback用于循环,例如标记中的自定义照片。

OnMapReadyCallback用于静态标记。