onMapReady 并不总是被调用
onMapReady not always called
我有三项活动:
主要活动:
public void start_main_map(View view) {
Intent intent = new Intent(this, com.example.MainMap.class);
startActivity(intent);
}
主地图:
protected GoogleApiClient mGoogleApiClient;
@Override
protected void onCreate(Bundle savedInstanceState) {
Log.i(TAG, "onCreate");
SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map);
mapFragment.getMapAsync(this);
}
@Override
protected void onStart() {
Log.i(TAG, "onStart");
mGoogleApiClient.connect();
super.onStart();
}
@Override
protected void onStop() {
Log.i(TAG, "onStop");
mGoogleApiClient.disconnect();
super.onStop();
}
@Override
protected void onPause() {
Log.i(TAG, "onPause");
super.onPause();
}
@Override
public void onResume() {
Log.i(TAG, "onResume");
super.onResume();
}
@Override
public void onMapReady(GoogleMap googleMap) {
Log.i(TAG, "onMapReady");
// do some serious work here
}
指南:
private void implement_back_button() {
final Intent intent = new Intent(this, com.example.MainMap.class);
back = (Button) findViewById(R.id.back_button);
back.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startActivity(intent);
}
});
}
每当我从 MainActivity
到 MainMap
我得到:
I/MainMap: onCreate
I/MainMap: onStart
I/MainMap: onResume
I/MainMap: onMapReady
然而,每当我从 Guide
转到 MainMap
(使用 back_button
或按手机中的返回键)时,我只会得到:
I/MainMap: onCreate
I/MainMap: onStart
I/MainMap: onResume
不,onMapReady
- 所以 "serious work" 永远不会被解决。我无法理解这种行为。如何确保在所有情况下都调用 onMapReady
?
当您从其他 Activity 处按回时,地图 Activity class 会继续。由于之前已经加载了地图,因此不会再次调用 onMapReady。
要解决这个问题,只需在开始地图 Activity
中的其他 activity 之前完成地图 Activity
像这样
Intent intent = new Intent(MapActivity.class, OtherActivity.class);
startActivity(intent);
MapActivity.this.finish();
从MainActivity
到MainMap
:
onMapReady()
调用,因为MainMap
第一次创建。
从Guide
到MainMap
:
onMapReady()
没有被调用,因为你刚回到 MainMap
并且 MainMap
已经存在于 Activity stack
和它的 Map
是 ready
.
解法:
在开始之前完成 MainMap
Guide
Activity。
完成地图 Activity 有点笨手笨脚。
如果恢复 Google 地图 Activity,您应该能够重新使用 Google 地图参考。
像这样的东西应该可以工作:
protected GoogleApiClient mGoogleApiClient;
protected SupportMapFragment mapFragment;
protected GoogleMap mMap;
@Override
protected void onCreate(Bundle savedInstanceState) {
Log.i(TAG, "onCreate");
mapFragment = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map);
mapFragment.getMapAsync(this);
}
@Override
protected void onStart() {
Log.i(TAG, "onStart");
mGoogleApiClient.connect();
super.onStart();
}
@Override
protected void onStop() {
Log.i(TAG, "onStop");
mGoogleApiClient.disconnect();
super.onStop();
}
@Override
public void onResume() {
Log.i(TAG, "onResume");
super.onResume();
//Added:
if (mMap == null) {
mapFragment.getMapAsync(this);
} else {
doSomeSeriousWork();
}
}
@Override
public void onMapReady(GoogleMap googleMap) {
mMap = googleMap;
Log.i(TAG, "onMapReady");
doSomeSeriousWork();
}
public void doSomeSeriousWork() {
// do some serious work here
}
我有三项活动:
主要活动:
public void start_main_map(View view) {
Intent intent = new Intent(this, com.example.MainMap.class);
startActivity(intent);
}
主地图:
protected GoogleApiClient mGoogleApiClient;
@Override
protected void onCreate(Bundle savedInstanceState) {
Log.i(TAG, "onCreate");
SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map);
mapFragment.getMapAsync(this);
}
@Override
protected void onStart() {
Log.i(TAG, "onStart");
mGoogleApiClient.connect();
super.onStart();
}
@Override
protected void onStop() {
Log.i(TAG, "onStop");
mGoogleApiClient.disconnect();
super.onStop();
}
@Override
protected void onPause() {
Log.i(TAG, "onPause");
super.onPause();
}
@Override
public void onResume() {
Log.i(TAG, "onResume");
super.onResume();
}
@Override
public void onMapReady(GoogleMap googleMap) {
Log.i(TAG, "onMapReady");
// do some serious work here
}
指南:
private void implement_back_button() {
final Intent intent = new Intent(this, com.example.MainMap.class);
back = (Button) findViewById(R.id.back_button);
back.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
startActivity(intent);
}
});
}
每当我从 MainActivity
到 MainMap
我得到:
I/MainMap: onCreate
I/MainMap: onStart
I/MainMap: onResume
I/MainMap: onMapReady
然而,每当我从 Guide
转到 MainMap
(使用 back_button
或按手机中的返回键)时,我只会得到:
I/MainMap: onCreate
I/MainMap: onStart
I/MainMap: onResume
不,onMapReady
- 所以 "serious work" 永远不会被解决。我无法理解这种行为。如何确保在所有情况下都调用 onMapReady
?
当您从其他 Activity 处按回时,地图 Activity class 会继续。由于之前已经加载了地图,因此不会再次调用 onMapReady。
要解决这个问题,只需在开始地图 Activity
中的其他 activity 之前完成地图 Activity像这样
Intent intent = new Intent(MapActivity.class, OtherActivity.class);
startActivity(intent);
MapActivity.this.finish();
从MainActivity
到MainMap
:
onMapReady()
调用,因为MainMap
第一次创建。
从Guide
到MainMap
:
onMapReady()
没有被调用,因为你刚回到 MainMap
并且 MainMap
已经存在于 Activity stack
和它的 Map
是 ready
.
解法:
在开始之前完成 MainMap
Guide
Activity。
完成地图 Activity 有点笨手笨脚。 如果恢复 Google 地图 Activity,您应该能够重新使用 Google 地图参考。
像这样的东西应该可以工作:
protected GoogleApiClient mGoogleApiClient;
protected SupportMapFragment mapFragment;
protected GoogleMap mMap;
@Override
protected void onCreate(Bundle savedInstanceState) {
Log.i(TAG, "onCreate");
mapFragment = (SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map);
mapFragment.getMapAsync(this);
}
@Override
protected void onStart() {
Log.i(TAG, "onStart");
mGoogleApiClient.connect();
super.onStart();
}
@Override
protected void onStop() {
Log.i(TAG, "onStop");
mGoogleApiClient.disconnect();
super.onStop();
}
@Override
public void onResume() {
Log.i(TAG, "onResume");
super.onResume();
//Added:
if (mMap == null) {
mapFragment.getMapAsync(this);
} else {
doSomeSeriousWork();
}
}
@Override
public void onMapReady(GoogleMap googleMap) {
mMap = googleMap;
Log.i(TAG, "onMapReady");
doSomeSeriousWork();
}
public void doSomeSeriousWork() {
// do some serious work here
}