Android Google Maps onMapReady存储GoogleMap

时间:2015-07-09 21:01:04

标签: android google-maps maps

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

感谢您的回答!

1 个答案:

答案 0 :(得分:5)

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

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

这是一个简单的例子来说明。每次用户点击地图时,此代码都会放置一个标记,您需要有效的地图参考。还有一个按钮可以调用startActivityForResult()并启动另一个活动。

以下是代码:

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");

            }
        });

    }
}

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

您可以看到,在按钮单击启动另一个活动后调用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