HMS Map Kit首次加载正常 第二次加载抛出数组越界异常崩溃
问题根因
该崩溃是FragmentContainerView配合导航组件使用时,MapView生命周期管理逻辑与原生<fragment>标签存在差异,叠加MapView初始化顺序错误、HMS SDK重复初始化导致内部状态异常,触发数组越界。
解决方案
1. 调整MapView初始化顺序
MapView必须先执行生命周期初始化,再绑定地图回调,修正onViewCreated中的代码顺序:
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) ((requireActivity()) as MainActivity).hideShowBottomBar(true) initialising() gettingDatForMap() getDeviceLocation() // 先调用MapView生命周期方法,再绑定回调 car_maps.onCreate(mapViewBundle ?: savedInstanceState) car_maps.getMapAsync(this) implementingClickListener() }
2. 调整ApiKey初始化位置
将MapsInitializer.setApiKey("你的ApiKey")从Fragment的onCreate中移到项目自定义Application的onCreate方法中,避免每次Fragment创建重复初始化SDK导致状态混乱。
3. 补全MapView生命周期绑定
在地图Fragment的所有生命周期方法中同步调用MapView对应的生命周期方法,避免状态残留:
override fun onStart() { super.onStart() car_maps.onStart() } override fun onResume() { super.onResume() car_maps.onResume() } override fun onPause() { super.onPause() car_maps.onPause() } override fun onStop() { super.onStop() car_maps.onStop() } override fun onDestroyView() { super.onDestroyView() car_maps.onDestroy() } override fun onSaveInstanceState(outState: Bundle) { super.onSaveInstanceState(outState) val mapViewBundle = outState.getBundle(MAPVIEW_BUNDLE_KEY) ?: Bundle() car_maps.onSaveInstanceState(mapViewBundle) outState.putBundle(MAPVIEW_BUNDLE_KEY, mapViewBundle) } override fun onLowMemory() { super.onLowMemory() car_maps.onLowMemory() }
4. 适配FragmentContainerView导航逻辑
在导航图中给地图Fragment配置单例启动模式,避免切换导航时重复创建地图实例:
<fragment android:id="@+id/findCarMapsFragment" android:name="com.shazza.shazzaapp.ui.userside.fragments.findcarmapsfragment.FindCarMapsFragment" android:launchMode="singleTop" />
内容的提问来源于stack exchange,提问作者Manzoor Ahmad
相关产品推荐
相关产品推荐

