安卓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 }
关键调整说明
- 异常捕获范围修正:把
try-catch放到长按回调内部,覆盖Geocoder地址解析的核心代码段,确保异常能被捕获。 - 精准捕获异常类型:Geocoder在无网络时会抛出
IOException,单独捕获该类型能准确识别网络问题;同时保留RuntimeException作为兜底。 - 空列表防护:增加
address.isNotEmpty()判断,避免地址解析返回空列表时出现数组越界异常。
内容的提问来源于stack exchange,提问作者kuyajik
相关产品推荐
相关产品推荐

