У меня проблемы, похожие на ту, что на этот вопрос. Однако, в отличие от этого вопроса, у меня есть правильная настройка (ключи API указаны в манифесте, API карт и мест включены в консоли Google), потому что код работает наиболее времени:
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
) не обнаруживается. Я понимаю, что в Котлине все исключения не отмечены, но я предполагаю, что они будут пойманы, если возникнет ошибка. Какие-нибудь подсказки?
Обновлено:
Похоже, при отлове исключения внутри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()
работает асинхронно (и что ошибки генерируются API Places из отдельного потока), но я не уверен (performPlaceDetection()
вызывается из MainActivity приложения Android). Был бы признателен за некоторый вклад в это.
Убедитесь, что RunTimeExecutionException
импортирован с com.google.android.gms.tasks.RuntimeExecutionException
. Возможно, вы импортировали его из другого пакета, а это значит, что это другое исключение.
Я считаю, что у меня правильный импорт: import com.google.android.gms.tasks.RuntimeExecutionException
Я думаю, что фактическое выброшенное исключение может быть ApiException, которое не перехвачено, а исключение RuntimeExecutionException выбрасывается позже, потому что ApiException не обрабатывается. Я думаю, это потому, что он вложен в сообщение об исключении RuntimeExecutionException. Вы можете это проверить? Я обновлю свой ответ, если это так.
Сначала я пытался поймать ApiException
, но у меня была та же проблема, и тогда я переключился на попытку поймать RuntimeExecutionException
.
Вы получаете ту же ошибку при перехвате исключения ApiException?
не могли бы вы добавить этот оператор catch? catch(e: Exception) { println(e::class.qualifiedName) }
Я отключил подключение (чтобы заставить RuntimeExecutionException
, связанный с сетью) и попытался поймать общий Exception
, и, как и раньше, он не улавливается, и я просто получаю обычную ошибку: com.google.android.gms.tasks.RuntimeExecutionException: com.google.android.gms.common.api.ApiException: 7: NETWORK_ERROR at com.google.android.gms.tasks.zzu.getResult(Unknown Source:17) at com.example.app.MyActivity$performPlaceDetection$1.onComplete(MyActivity.kt:197)
Похоже, что перехват исключения внутри 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 () работает асинхронно (и что ошибки генерируются API Places из отдельного потока), но я не уверен (performPlaceDetection () вызывается из MainActivity приложения Android)
Не обращайте внимания на ответы, в которых говорится, что вам следует использовать try-catch с Task<T>
из библиотек Google.
Проблема здесь в том, что люди пытаются получить результат от невыполненной задачи.
Если вы посмотрите на исходный код, вы можете ясно увидеть, что если вы обращаетесь к task.result
и task.exception != null
, реализация выдаст RuntimeExecutionException
.
Вы должны получить такой результат:
FirebaseInstanceId.getInstance().instanceId.addOnCompleteListener {
if (it.isSuccessful) {
val token = it.result?.token
if (!token.isNullOrBlank()) {
//do something with the token
} else {
logger.error("Token Is Empty")
}
} else {
val error = it.exception ?: Exception("Empty Exception")
logger.error("$error")
}
}
Ваше обновление помогло мне ... пожалуйста, сделайте это как ответ. Благодарю.