¿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 configurar el headerView de NavigationView con Anko DSL?
  • Kotlin genera constructor que establece valores pnetworkingeterminados para arguments anulados
  • Henetworkingar de la class abstracta con multiplicar vars en Kotlin
  • Referencia no resuelta a la function en Kotlin Android
  • Múltiples requestes de modificación2 usando Flowable en Kotlin
  • Error de data binding en Android Spinner
  • No se pudieron encontrar las classs de Kotlin en el module de características de otro module
  • Explicación de la function literal con receptor en Kotlin
  • ¿Por qué obtengo el error java.lang.IllegalStateException: instancia no inicializada?
  • Prueba RxJava2 Flowable Query Room
  • ¿Cómo deserializar ThreeTen LocalDateTime en Retrofit?