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

OSMDroid调用animateTo动画期间触摸视图触发空指针异常崩溃

问题根因
  • 该崩溃是osmdroid库的已知版本bug:MapController.stopAnimation() 方法未对动画实例做非空校验,直接调用了cancel()方法。当MyLocationNewOverlay检测到触摸事件、主动关闭位置跟随并停止地图动画时,若动画已执行完成/未完成初始化,就会触发空指针异常。
解决方案

方案1:升级库版本(优先选择)

将osmdroid依赖升级至6.1.18及以上版本,官方已在该版本修复了stopAnimation的非空判断逻辑。

方案2:自定义兼容处理(无法升级版本时使用)

子方案2.1 重写MapController加异常捕获

自定义安全的MapController子类,捕获空指针异常:

class SafeMapController(mapView: MapView) : MapController(mapView) {
    override fun stopAnimation() {
        try {
            super.stopAnimation()
        } catch (ignore: NullPointerException) {
        }
    }
}

初始化时替换原有的MapController即可:

mapController = SafeMapController(map)

子方案2.2 禁用位置跟随的触摸自动停止逻辑

给MyLocationNewOverlay设置禁止触摸停止跟随的参数:

mLocationOverlay.setOptions(MyLocationNewOverlay.OPTION_NO_TRACKING_ON_TOUCH)

附加优化

给定位结果加非空判断,避免定位为空时的异常:

mLocationOverlay.runOnFirstFix {
    runOnUiThread {
        mLocationOverlay.myLocation?.let { location ->
            mapController.animateTo(location, 14.0, 4000)
        }
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 16:36:00