Tengo un problema con mi aplicación de Android. Soy bastante nuevo con esto y tengo algunos problemas para encontrar la documentación correcta para un asíncrono. Estoy usando la biblioteca kohttp para ayudarme un poco.
La cuestión es que no puede ejecutar esto en el subproceso principal de la interfaz de usuario, por lo que quiero que esta solicitud sea asíncrona. No puedo encontrar una referencia clara en la documentación y realmente no sé cómo hacer esto en Kotlin simple.
Esto es lo que se me ocurre; en una clase separada llamada LoginCall . Intenté otras respuestas, sin embargo, esto no tuvo éxito. ¿Cómo puedo ejecutar esto en un nuevo hilo y seguir usando la respuesta?
class LoginCall { fun callLoginRequest(a:String, b:String): Any { val response: Response = httpPost { host = "XXX" path = "XXX" param { } header { } body { form { "email" to a "password" to b } } } return response } }Hay muchas maneras de lograr esto, si está usando Android como plataforma subyacente, puede usar el componente nativo llamado AsyncTask una buena publicación SO sobre cómo usarlo.
Si desea aprovechar kotlin como lenguaje y las funciones que proporciona, puede intentar usar coroutines ref .
Personalmente, recomendaría coroutines , simplifica el manejo de excepciones y errores, también evita el infierno de devolución de llamada.
aquí hay una muestra del mismo código en una rutina,
// global private val mainScope = CoroutineScope(Dispatchers.MAIN + SupervisorJob()) // inside a method mainScope.launch{ withContext(Dispatchers.IO){ // do your async task here, as you can see, you're doing this in an IO thread scope. } }Desde kohttp 0.10.0, puede usar métodos asíncronos para tales casos. Puedes probarlos.
Ejemplo de código:
suspend fun callLoginRequest(a:String, b:String): Any { val response: Differed<Response> = httpPostAsync { host = "XXX" path = "XXX" param { } header { } body { form { "email" to a "password" to b } } } // for further usage in coroutines return response.await() }Y llama a esta función desde coroutine