Ваш код верен, но неэффективен, так как это фактически ожидание занятости l oop повторный вызов ListenableFuture.isDone
до его завершения.
Вы должны использовать API обратного вызова, предоставляемый всякий раз, когда вам нужно выполнить преобразование между асинхронным c API и функциями приостановки:
suspend fun <T> ListenableFuture<T>.await(): T = suspendCancellableCoroutine { cont ->
// Special handling for Future<*> objects
cont.cancelFutureOnCancellation(this)
addCallback(object : ListenableFutureCallback<T> {
override fun onFailure(ex: Throwable) {
cont.resumeWithException(ex)
}
override fun onSuccess(result: T) {
cont.resume(result)
}
})
}
Это не приведет к потере времени на проверку, завершится ли будущее, а просто скажет будущему возобновить приостановленную функцию, когда результат будет фактически доступен.