Android开发疑问:AsyncTask后调用地图更新函数的位置及崩溃问题
解决AsyncTask更新GoogleMap时的崩溃问题
嘿,我来帮你排查下这个崩溃问题~
你的核心问题在于两个异步操作的执行顺序不确定:GetCountryDetails这个AsyncTask和GoogleMap的getMapAsync都是异步执行的,谁先完成完全没谱。如果AsyncTask先跑完,这时候onMapReady还没回调,你手里的map要么是null,要么还没完成初始化,调用map.moveCamera或者map.addMarker自然就会崩溃了。
给你一套具体的修复方案,分步骤来:
1. 保存核心实例为成员变量
在你的Activity里定义两个成员变量,分别存GoogleMap实例和首都信息,这样两个异步操作都能访问到:
private GoogleMap mMap; private String countryCapital;
2. 调整onMapReady逻辑
当地图准备好后,先把实例存起来,同时检查是否已经拿到了首都信息,如果有就直接更新地图:
@Override public void onMapReady(GoogleMap map) { mMap = map; map.setMapType(GoogleMap.MAP_TYPE_HYBRID); map.getUiSettings().setMapToolbarEnabled(true); // 要是AsyncTask已经拿到首都数据,直接更新 if (countryCapital != null) { updateMap(); } }
3. 修改AsyncTask的onPostExecute
拿到首都信息后,先判断地图是否已经初始化完成,完成了就直接更新,没完成就先存着等地图准备好:
@Override protected void onPostExecute(CountryInfo countryInfo) { countryCapital = countryInfo.getCapital(); // 地图已经准备好的话直接更新 if (mMap != null) { updateMap(); } // 没准备好的话,等onMapReady触发时再处理 }
4. 简化updateMap方法
不用再传map参数了,直接用成员变量,同时加个空判断防止意外崩溃:
public void updateMap() { // 先做空检查,避免空指针 if (mMap == null || countryCapital == null) { return; } LatLng capitalCity = getCityLatitude(this, countryCapital); mMap.moveCamera(CameraUpdateFactory.newLatLng(capitalCity)); MarkerOptions marker = new MarkerOptions().position(capitalCity).title(countryCapital); mMap.addMarker(marker); }
额外提醒
- 如果你用的是较新的Android版本,AsyncTask已经被官方废弃了,后续可以学习用Coroutines协程或者ExecutorService来做异步任务,更稳定灵活。
- 要是你的
getCityLatitude方法也是异步获取经纬度的,那还要再调整这部分的逻辑,确保拿到经纬度后再更新地图。
内容的提问来源于stack exchange,提问作者Sook Lim
相关产品推荐
相关产品推荐

