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
相关产品推荐
相关产品推荐

