【发布时间】:2018-10-12 07:22:03
【问题描述】:
我遇到了与this question 类似的问题。不过,与那个问题不同的是,我的设置正确(API 密钥在清单中指定,在 Google 控制台上启用了地图和地点 API),因为代码大多数时间都可以工作:
private fun performPlaceDetection() {
// use the Places API.
try {
val placeResult = placeDetectionClient.getCurrentPlace(null)
placeResult.addOnCompleteListener({ task ->
val likelyPlaces = task.result
for (placeLikelihood in likelyPlaces) {
Timber.d( String.format("Place '%s' has likelihood: %g",
placeLikelihood.place.name,
placeLikelihood.likelihood))
}
likelyPlaces.release()
})
} catch (e: SecurityException) {
Timber.d("error fetching current place. permissions?: " + e.message)
e.printStackTrace()
} catch (e: RuntimeExecutionException) {
Timber.d("error fetching current place: " + e.message)
e.printStackTrace()
}
}
代码偶尔会失败:
com.google.android.gms.tasks.RuntimeExecutionException: com.google.android.gms.common.api.ApiException: 13: ERROR
或者当我关闭网络连接时,我收到此错误:
com.google.android.gms.tasks.RuntimeExecutionException: com.google.android.gms.common.api.ApiException: 7: NETWORK_ERROR
让我难过的是,无论哪种情况,异常 (RunTimeExecutionException) 都没有被捕获。我知道在 Kotlin 中,所有异常都是未经检查的,但我想如果出现错误它们会被捕获。有什么线索吗?
更新:
看起来像捕获异常inside OnCompleteListener 有效,而外部没有被捕获:
try {
val placeResult = placeDetectionClient.getCurrentPlace(null)
placeResult.addOnCompleteListener({ task ->
try {
val likelyPlaces = task.result
for (placeLikelihood in likelyPlaces) {
Timber.d( String.format("Place '%s' has likelihood: %g",
placeLikelihood.place.name,
placeLikelihood.likelihood))
}
likelyPlaces.release()
} catch (e: Exception) {
Timber.d("inner exception: $e")
}
})
} catch(e: Exception) {
Timber.d("outer exception: " + e::class.qualifiedName)
}
我不确定为什么会捕获内部异常。我的猜测是这是因为placeDetectionClient.getCurrentPlace() 异步运行(并且错误是由 Places API 从单独的线程引发的),但我不确定(performPlaceDetection() 是从 Android 应用程序的 MainActivity 调用的)。希望能对此提供一些意见。
【问题讨论】:
-
您的更新帮助了我.. 请作为答案。谢谢。
标签: android exception exception-handling kotlin google-places-api