Osmdroid点击地图后Marker延迟3-5秒才绘制显示如何解决
OSMDroid点击添加Marker延迟3-5秒渲染问题修复
问题现状
- 已完成OSMDroid地图基础集成:可正常加载瓦片、定位到用户当前位置
- 已实现地图点击交互:点击地图时添加点位Marker,同时将点击位置的经纬度填充到对应输入框
- 异常表现:点击后经纬度可立即写入输入框,但Marker需要等待3-5秒才会在地图上渲染显示
- 当前使用依赖版本:
implementation 'org.osmdroid:osmdroid-android:6.0.3'
初始实现核心代码:
private fun showMap(dLatInit: Double, dLonInit: Double){ mapView.setTileSource(TileSourceFactory.MAPNIK) Configuration.getInstance().userAgentValue =packageName mapView.setMultiTouchControls(true) mapController = mapView.controller as MapController mapController.setZoom(10.0) val pointCenter= GeoPoint(dLatInit, dLonInit) mapController.setCenter(pointCenter) val mReceive: MapEventsReceiver = object : MapEventsReceiver { override fun singleTapConfirmedHelper(geoPoint: GeoPoint): Boolean { Marker(mapView).apply { this.position = geoPoint this.setAnchor(Marker.ANCHOR_CENTER, Marker.ANCHOR_CENTER) mapView.overlays.add(this) } populateEditText(textInputLayoutMapLat.editText, geoPoint.latitude.also { dMapLat =it }) populateEditText(textInputLayoutMapLon.editText, geoPoint.longitude.also { dMapLon =it }) return false } override fun longPressHelper(p: GeoPoint): Boolean { return false } } val overlayEvents = MapEventsOverlay(mReceive) mapView.overlays.add(overlayEvents) }
问题原因
OSMDroid的Overlay列表新增元素后,不会主动触发地图视图立即重绘,依赖系统默认的视图重绘调度周期,加上6.0.3版本本身存在渲染调度的已知缺陷,最终导致Marker延迟数秒才显示。
修复方案
- 核心修复:新增Marker后主动调用重绘方法
给overlays添加完Marker后,立刻执行mapView.invalidate()通知视图立即刷新,跳过默认的长周期重绘等待。 - 可选优化:升级依赖版本
6.0.3版本发布时间较早,存在不少渲染相关的已知问题,可升级到后续稳定版本(如org.osmdroid:osmdroid-android:6.1.18),无需修改业务代码即可获得更稳定的渲染响应速度。
修复后的点击回调代码如下:
override fun singleTapConfirmedHelper(geoPoint: GeoPoint): Boolean { Marker(mapView).apply { position = geoPoint setAnchor(Marker.ANCHOR_CENTER, Marker.ANCHOR_CENTER) mapView.overlays.add(this) } // 主动触发地图重绘,解决Marker显示延迟问题 mapView.invalidate() populateEditText(textInputLayoutMapLat.editText, geoPoint.latitude.also { dMapLat =it }) populateEditText(textInputLayoutMapLon.editText, geoPoint.longitude.also { dMapLon =it }) return false }
额外提示:如果业务要求点击地图仅保留最新的一个点位标记,可在添加新Marker前遍历overlays移除之前添加的Marker对象,避免大量无用标记堆积影响地图渲染性能。
内容的提问来源于stack exchange,提问作者seekingStillness
相关产品推荐
相关产品推荐

