【问题标题】:Android Google Maps onMapReady store GoogleMapAndroid 谷歌地图 onMapReady store GoogleMap
【发布时间】:2015-07-09 21:01:03
【问题描述】:

我有一个正在开发的 android 应用程序,它使用这个 google maps api v2。要使用onMapReady callback 获取谷歌地图即时消息的实例。 在这个回调中,我得到了一个谷歌地图的实例,我可以在本地存储这个实例并重复使用它,而无需每次我必须更新地图时都得到一个新的实例吗?或者随着时间的推移重用这个实例有什么问题吗?我只是想确定没有任何问题可以让我遇到问题。

感谢您的回答!

【问题讨论】:

    标签: android google-maps maps


    【解决方案1】:

    是的,您可以存储 Google 地图引用的一个实例,然后像调用 getMap() 而不是 getMapAsync() 一样重复使用它。

    如果需要,请确保从onResume() 重新调用getMapAsync(),因为在调用onPause() 后地图引用通常会变为空。

    这里有一个简单的例子来说明。每次用户点击地图时,此代码都会放置一个标记,您需要一个有效的地图引用来执行此操作。还有一个按钮调用startActivityForResult() 并启动另一个Activity。

    代码如下:

    public class MapsActivity extends AppCompatActivity implements OnMapReadyCallback {
    
        private GoogleMap mMap;
        private Marker marker;
        private Button button;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_maps);
    
            button = (Button) findViewById(R.id.testButton);
    
            button.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Intent i = new Intent(MapsActivity.this, TestActivity.class);
                    startActivityForResult(i, 100);
                }
            });
        }
    
        @Override
        protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    
            if (requestCode == 100) {
                Log.d("MyMap", "onActivityResult " + data.getStringExtra("result"));
            }
        }
    
        @Override
        protected void onPause() {
            super.onPause();
    
            Log.d("MyMap", "onPause");
        }
    
        @Override
        protected void onResume() {
            super.onResume();
    
            Log.d("MyMap", "onResume");
            setUpMapIfNeeded();
        }
    
        private void setUpMapIfNeeded() {
    
            if (mMap == null) {
    
                Log.d("MyMap", "setUpMapIfNeeded");
                ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map))
                        .getMapAsync(this);
            }
        }
    
        @Override
        public void onMapReady(GoogleMap googleMap) {
            Log.d("MyMap", "onMapReady");
            mMap = googleMap;
            setUpMap();
        }
    
        private void setUpMap() {
    
            mMap.setMyLocationEnabled(true);
            mMap.setMapType(GoogleMap.MAP_TYPE_HYBRID);
            mMap.getUiSettings().setMapToolbarEnabled(false);
    
    
            mMap.setOnMapClickListener(new GoogleMap.OnMapClickListener() {
    
                @Override
                public void onMapClick(LatLng point) {
    
                    Log.d("MyMap", "MapClick");
    
                    //remove previously placed Marker
                    if (marker != null) {
                        marker.remove();
                    }
    
                    //place marker where user just clicked
                    marker = mMap.addMarker(new MarkerOptions().position(point).title("Marker")
                            .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_MAGENTA)));
    
                    Log.d("MyMap", "MapClick After Add Marker");
    
                }
            });
    
        }
    }
    

    这是运行应用程序的结果日志,点击一次以放置标记,然后单击按钮启动第二个 Activity,返回到地图 Activity,然后再次点击地图以放置标记。

    您可以看到,在单击按钮启动另一个 Activity 后调用 onPause() 时,地图引用丢失了,因为在调用 onResume() 时,它再次调用了 getMapAsync()。不过,这一切都很好,因为设置代码时考虑到了这一点。

     D/MyMap﹕ onResume
     D/MyMap﹕ setUpMapIfNeeded
     D/MyMap﹕ onMapReady
     D/MyMap﹕ MapClick
     D/MyMap﹕ MapClick After Add Marker
     D/MyMap﹕ onPause
     D/MyMap﹕ onActivityResult ok
     D/MyMap﹕ onResume
     D/MyMap﹕ setUpMapIfNeeded
     D/MyMap﹕ onMapReady
     D/MyMap﹕ MapClick
     D/MyMap﹕ MapClick After Add Marker
     D/MyMap﹕ MapClick
     D/MyMap﹕ MapClick After Add Marker
     D/MyMap﹕ MapClick
     D/MyMap﹕ MapClick After Add Marker
     D/MyMap﹕ MapClick
     D/MyMap﹕ MapClick After Add Marker
     D/MyMap﹕ MapClick
     D/MyMap﹕ MapClick After Add Marker
     D/MyMap﹕ MapClick
     D/MyMap﹕ MapClick After Add Marker
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-08-16
      • 1970-01-01
      • 2020-10-11
      • 2012-11-27
      • 2015-12-19
      • 2015-12-16
      • 1970-01-01
      相关资源
      最近更新 更多