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

安卓Mapbox应用无网络时长按地图崩溃,如何正确捕获运行时异常?

解决Mapbox安卓应用无网络时长按地图崩溃问题

你的代码中,外层的try-catch无法捕获长按回调里的异常——因为addOnMapLongClickListener只是注册监听器,实际的长按逻辑是在后续异步触发的回调Lambda中执行的,外层try-catch覆盖不到这个范围。需要把异常捕获逻辑移到回调内部,同时处理Geocoder的具体异常类型。

修改后的代码

val annotationApi = mapView?.annotations
val pointAnnotationManager = annotationApi?.createPointAnnotationManager(mapView!!)

binding.mapView.gestures.addOnMapLongClickListener { point ->
    val lat = point.latitude()
    val lng = point.longitude()

    pointAnnotationManager?.deleteAll()
    val pointAnnotationOptions = PointAnnotationOptions()
    bitmapFromDrawableRes(
        this@PagePlanRouteMap,
        R.drawable.red_marker
    )?.let {
        pointAnnotationOptions
            .withPoint(Point.fromLngLat(lng, lat))
            .withIconImage(it)
    }

    userPickALocation = true
    pointAnnotationManager?.create(pointAnnotationOptions)

    // 将异常捕获逻辑移到回调内部,覆盖地址解析操作
    try {
        val geoCoder = Geocoder(this@PagePlanRouteMap)
        val address: List<Address> = geoCoder.getFromLocation(lat, lng, 1)
        
        if (address.isNotEmpty()) {
            val result = address[0].getAddressLine(0)
            Toast.makeText(
                applicationContext,
                result,
                Toast.LENGTH_SHORT
            ).show()
            etDestination.setText(result)
            binding.searchResultContainer.visibility = View.INVISIBLE
        } else {
            Toast.makeText(this, "无法获取地址信息", Toast.LENGTH_SHORT).show()
        }
    } catch (e: IOException) {
        // 无网络/网络异常时触发该分支
        Toast.makeText(this, "无网络/网络缓慢", Toast.LENGTH_SHORT).show()
    } catch (e: RuntimeException) {
        // 兜底处理其他运行时异常
        Toast.makeText(this, "获取地址失败", Toast.LENGTH_SHORT).show()
    }

    true
}

关键调整说明

  1. 异常捕获范围修正:把try-catch放到长按回调内部,覆盖Geocoder地址解析的核心代码段,确保异常能被捕获。
  2. 精准捕获异常类型:Geocoder在无网络时会抛出IOException,单独捕获该类型能准确识别网络问题;同时保留RuntimeException作为兜底。
  3. 空列表防护:增加address.isNotEmpty()判断,避免地址解析返回空列表时出现数组越界异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 08:50:32