You need to enable JavaScript to run this app. Kotlin中如何将Retrofit onResult获取的接口数据传递给onMapReady展示到Google地图
优惠活动
大模型
产品
解决方案
定价
更多

Kotlin中如何将Retrofit onResult获取的接口数据传递给onMapReady展示到Google地图

问题解决方案

核心问题根源

两个异步回调的执行时序无固定顺序:

  • onMapReady 是地图组件初始化完成的回调
  • onResult 是Retrofit网络请求返回的回调
    原有代码既没有缓存网络返回的数据,也没有标记地图的就绪状态,任意一个回调先执行时都拿不到另一个的结果,自然无法完成数据绑定。

实现思路

通过成员变量缓存+状态标记的方式,等地图就绪、数据获取两个条件都满足时,统一触发Marker绘制逻辑,完全规避回调时序不确定的问题。

具体修改代码

class HomeMapsActivity : AppCompatActivity(), OnMapReadyCallback,
    MapHomeContract.View {

    private lateinit var mMap: GoogleMap
    // 新增:标记地图是否已初始化完成
    private var isMapReady = false
    // 新增:缓存网络请求拿到的anak数据列表
    private var anakList: List<Anak> = emptyList()

    lateinit var presenter: MapHomePresenter
    lateinit var prefsManager: PrefsManager

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_home_maps)
        supportActionBar!!.title = "Posisi driver"
        supportActionBar!!.setDisplayHomeAsUpEnabled(true)

        // 初始化地图异步加载
        val mapFragment = supportFragmentManager
            .findFragmentById(R.id.map) as SupportMapFragment
        mapFragment.getMapAsync(this)

        // 初始化请求相关依赖
        prefsManager = PrefsManager(this)
        presenter = MapHomePresenter(this)
        presenter.getAnak(prefsManager.prefsIdUser)
    }

    override fun onMapReady(googleMap: GoogleMap) {
        mMap = googleMap
        // 标记地图已就绪
        isMapReady = true
        // 触发绘制逻辑(若此时数据已获取会直接执行)
        updateMapMarkers()
    }

    override fun onResult(dataAnakResponse: AnakResponse) {
        // 缓存接口返回的数据
        anakList = dataAnakResponse.anak
        // 触发绘制逻辑(若此时地图已就绪会直接执行)
        updateMapMarkers()
    }

    // 新增:统一的Marker绘制逻辑
    private fun updateMapMarkers() {
        // 前置校验:任意条件不满足直接返回,不执行绘制
        if (!isMapReady || anakList.isEmpty()) return

        // 遍历真实数据绘制Marker
        for (dataAnak in anakList) {
            // 替换为实体类中对应的真实经纬度字段
            val targetLatLng = LatLng(dataAnak.lat, dataAnak.lng)
            mMap.addMarker(
                MarkerOptions()
                    .position(targetLatLng)
                    .title(dataAnak.name) // 替换为实体类中对应的标题字段
            )
            // 可选:移动相机到Marker位置,设置缩放级别
            mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(targetLatLng, 15f))
        }
    }
}

注意事项

代码中dataAnak.lat、dataAnak.lng、dataAnak.name为示例写法,需要替换为你自定义的Anak实体类中对应的真实字段。


内容的提问来源于stack exchange,提问作者Aswar Kasim

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.02 20:36:03