Android Google 地图 onMapReady store GoogleMap
Android Google Maps onMapReady store GoogleMap
我有一个 android 应用程序正在开发中,它使用这个 google 地图 api v2。要使用 onMapReady callback 获取 google 地图 im 的实例。
在这个回调中,我得到了 google 地图的一个实例,我可以将这个实例存储在本地并重新使用它,而不是每次我必须更新地图时都得到一个新的实例吗?或者随着时间的推移重用这个实例有什么问题吗?我只是想确保没有任何问题可以解决问题。
感谢您的回答!
是的,您可以存储 Google 映射引用的实例,并像调用 getMap()
而不是 getMapAsync()
一样重新使用它。
只要确保在需要时从 onResume()
重新调用 getMapAsync()
,因为在调用 onPause()
后地图引用通常会变为 null。
这里举个简单的例子来说明。每次用户点击地图时,此代码都会放置一个标记,您需要有效的地图引用才能执行此操作。还有一个按钮调用 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,然后再次点击地图放置标记。
你可以看到,当 onPause()
在按钮点击启动另一个 Activity 后被调用时,地图引用丢失了,因为当 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
我有一个 android 应用程序正在开发中,它使用这个 google 地图 api v2。要使用 onMapReady callback 获取 google 地图 im 的实例。 在这个回调中,我得到了 google 地图的一个实例,我可以将这个实例存储在本地并重新使用它,而不是每次我必须更新地图时都得到一个新的实例吗?或者随着时间的推移重用这个实例有什么问题吗?我只是想确保没有任何问题可以解决问题。
感谢您的回答!
是的,您可以存储 Google 映射引用的实例,并像调用 getMap()
而不是 getMapAsync()
一样重新使用它。
只要确保在需要时从 onResume()
重新调用 getMapAsync()
,因为在调用 onPause()
后地图引用通常会变为 null。
这里举个简单的例子来说明。每次用户点击地图时,此代码都会放置一个标记,您需要有效的地图引用才能执行此操作。还有一个按钮调用 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,然后再次点击地图放置标记。
你可以看到,当 onPause()
在按钮点击启动另一个 Activity 后被调用时,地图引用丢失了,因为当 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