You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 06:41:21