Handler () postDelay no está disponible para este código de Kotlin, ¿cómo solucionarlo?

Tengo una function, donde simplemente explícitamente quiero retrasar el valor de retorno

private fun loadData(): DataModel? { Handler(Looper.getMainLooper()).postDelayed( when (fetchStyle) { FetchStyle.FETCH_SUCCESS -> return DataModel("Data Loaded") FetchStyle.FETCH_EMPTY -> return DataModel("") FetchStyle.FETCH_ERROR -> throw IllegalStateException("Error Fetching") }, 3000) } 

Sin embargo, hay un estado de advertencia que postDelayed es inalcanzable, por lo tanto, la demora de 3 postDelayed no se activa.

Para que sea alcanzable, tengo que agregar el paréntesis adicional alnetworkingedor

 private fun loadData(): DataModel? { Handler(Looper.getMainLooper()).postDelayed({ when (fetchStyle) { FetchStyle.FETCH_SUCCESS -> DataModel("Data Loaded") FetchStyle.FETCH_EMPTY -> DataModel("") FetchStyle.FETCH_ERROR -> throw IllegalStateException("Error Fetching") }}, 3000) } 

Pero luego, ya no puedo devolver el valor de DataModel. ¿Cómo podría solucionar esto para tener la demora de 3s, mientras que todavía podría devolver el DataModel respectivo o lanzar la exception?

Si solo quiere bloquear el hilo actual, puede usar Thread.sleep :

 private fun loadData(): DataModel? { Thread.sleep(3000); return when (fetchStyle) { FetchStyle.FETCH_SUCCESS -> DataModel("Data Loaded") FetchStyle.FETCH_EMPTY -> DataModel("") FetchStyle.FETCH_ERROR -> throw IllegalStateException("Error Fetching") } } 

Un ejemplo para usar Handler y Runnable en Runnable lugar, con una function de callback separada:

 private fun loadData(): DataModel? { Handler(Looper.getMainLooper()).postDelayed({ val result = when (fetchStyle) { FetchStyle.FETCH_SUCCESS -> DataModel("Data Loaded") FetchStyle.FETCH_EMPTY -> DataModel("") FetchStyle.FETCH_ERROR -> throw IllegalStateException("Error Fetching") } loadDataCallback(result) }, 3000) } fun useLoadData() { loadData() } private fun loadDataCallback(dataModel: DataModel?) { // use result here } 

Un enfoque más parecido a Kotlin, pasando una function como callback:

 private fun loadData(callback: (DataModel?) -> Unit): DataModel? { Handler(Looper.getMainLooper()).postDelayed({ val result = when (fetchStyle) { FetchStyle.FETCH_SUCCESS -> DataModel("Data Loaded") FetchStyle.FETCH_EMPTY -> DataModel("") FetchStyle.FETCH_ERROR -> throw IllegalStateException("Error Fetching") } callback(result) }, 3000) } fun useLoadData() { loadData { dataModel -> // use result here } } 

Tenga en count que estos ejemplos no bloquean ningún subprocess, y la parte Handler(Looper.getMainLooper()) del código de ejemplo original (que guardé para estos ejemplos) colocará la ejecución de la instrucción when y las devoluciones de llamada después de esa de vuelta en el hilo principal.

  • Posibilidad de llamar a un método estático de Java en Kotlin
  • Cómo usar null con kotlin @Parcelize
  • ¿Cuál es la mejor manera de declarar en el componente UI en Android con Kotlin?
  • LibGDX Scene2d UI: Tabla dentro de los problemas de layout de la tabla
  • Función Kotlin Array init
  • Error "Referencia no resuelta" de Kotlin TypeToken
  • Intellij IDEA no muestra las sugerencias disponibles para los resources de Android en los files de Kotlin
  • Obtuvo NoClassDefFoundError al pasar el map de lambda
  • Cloud.orbit.exception.UncheckedException: no sé cómo manejar el estado
  • Error " no se puede convertir a JSON" al intentar crear un object JSON de String
  • Kotlin i.inc () ¿10 veces más lento que i ++?