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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 01:25:06