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

