¿Las coroutines de kotlin tienen llamada asincrónica con timer?

¿Tiene Kotlin la posibilidad de llamar a la function async () en corutinas con algún time, que devolverá el resultado pnetworkingeterminado una vez que se complete?

Descubrí que solo es posible esperar, y que infinito esperar el resultado.

async { ... val result = computation.await() ... } 

Pero el caso de producción real de lo que necesita para devolver el resultado pnetworkingeterminado o la exception. ¿Cuál es la forma correcta de hacer algo en corotines de Kotlin? Me gusta algo similar a esto:

 async { ... val timeout = 100500 val result: SomeDefernetworkingClass = computation.await(timeout) if (result.isTimeout()) { // get default value } else { // process result } ... } 

Puede usar la withTimeout withTimeout. Lanzará una CancellationException cuando se agote el time. Podría atrapar esta exception y devolver su valor pnetworkingeterminado.

Algo como esto:

 async { ... val timeout = 100500L try { withTimeout(timeout) { computation.await() } ... } catch (ex: CancellationException) { defaultValue } } 

También puede usar la withTimeoutOrNull withTimeoutOrNull, que devuelve null en time de espera. Me gusta esto:

 async { ... val timeout = 100500L withTimeoutOrNull(timeout) { computation.await() } ?: defaultValue } 

Este enfoque no le permitirá diferenciar entre un time de espera y un cálculo que devuelve nulo sin embargo. El valor pnetworkingeterminado se devolverá en ambos casos.

Para get más información, consulte aquí: https://github.com/Kotlin/kotlinx.coroutines/blob/master/coroutines-guide.md#timeout

Combinando ambas extensiones y la solución @marstran, llegué a una solución que puede ajustarse mejor a sus requisitos de tener la function de espera con time de espera y valor pnetworkingeterminado. También creo que es una solución más limpia

Simplemente defina la function de extensión:

 suspend fun <T> Defernetworking<T>.await(timeout : Long, defaultValue : T) = withTimeoutOrNull(timeout) { await() } ?: defaultValue 

Y puedes usarlo en cualquier lugar. En lugar de

 async { ... val timeout = 100500L withTimeoutOrNull(timeout) { computation.await() } ?: defaultValue } 

Puedes hacer simplemente

 async { val timeout = 100500L computation.await(timeout, defaultValue) } 
  • ¿Cómo usar SQLite en Kotlin / Native?
  • Android 4.x VerifyError causado por el método de Kotlin
  • El nombre de la propiedad privada no coincide con la expresión regular
  • Setter no pidió Kotlin POJO
  • Cómo usar la anotación de Jackson JsonSubTypes en Kotlin
  • Android Kotlin Moshi Custom Json Adapter
  • Observable.combineLa causa de error más reciente después de actualizar a RxJava 2.xx - no se puede inferir el tipo
  • Jinq en Kotlin: ¿cómo convertir lambda en Java Serialized Lambda?
  • La animation SwipeRefreshLayout del primer bash de actualización se ejecuta sin parar
  • Recuperar valores del file `.properties` | la propiedad lateinit no se ha inicializado
  • Extensión de Kotlin para el próximo valor de Enum sin reflexión