升级Play Services到15.0.0后MapView.getMap()不支持该如何解决?
解决Play Services 15.0+中MapView.getMap()不再支持的问题
刚踩过一模一样的坑!当把Google Play Services从9.0.1升级到15.0.0版本后,MapView.getMap()确实被官方废弃并移除了——Google在15.0版本里把同步获取Map实例的方式换成了异步回调模式,避免阻塞主线程。
我当时查了资料后按下面的方式解决了问题,给你整理好完整的代码示例和说明:
核心解决思路
- 让你的Fragment(或Activity)实现
OnMapReadyCallback接口 - 用
MapView.getMapAsync(this)替代原来的MapView.getMap() - 在
onMapReady()回调中获取可用的GoogleMap实例
完整代码示例
public class MapsFragment extends Fragment implements OnMapReadyCallback { private MapView mMapView; private GoogleMap mGoogleMap; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // 先加载Fragment布局 View view = inflater.inflate(R.layout.fragment_maps, container, false); mMapView = view.findViewById(R.id.mapView); // 初始化MapView mMapView.onCreate(savedInstanceState); // 异步请求Map实例,回调会触发onMapReady方法 mMapView.getMapAsync(this); return view; } @Override public void onMapReady(GoogleMap googleMap) { mGoogleMap = googleMap; // 这里就可以正常操作GoogleMap了,比如设置地图类型、添加标记等 mGoogleMap.setMapType(GoogleMap.MAP_TYPE_NORMAL); // 示例:添加一个位置标记 mGoogleMap.addMarker(new MarkerOptions() .position(new LatLng(39.9042, 116.4074)) .title("北京")); } // 务必同步MapView的生命周期,和Fragment生命周期保持一致 @Override public void onResume() { super.onResume(); mMapView.onResume(); } @Override public void onPause() { super.onPause(); mMapView.onPause(); } @Override public void onDestroy() { super.onDestroy(); mMapView.onDestroy(); } @Override public void onLowMemory() { super.onLowMemory(); mMapView.onLowMemory(); } }
关键注意点
getMapAsync()是异步执行的,不会阻塞主线程,这也是Google废弃同步方法的核心原因- 只有在
onMapReady()回调触发后,GoogleMap实例才是完全可用的,别在回调外直接调用它的方法 - 必须同步MapView的生命周期方法(onResume、onPause等),否则容易出现地图加载异常或内存泄漏问题
内容的提问来源于stack exchange,提问作者dev90
相关产品推荐
相关产品推荐

