Hacer request HTTP onclick en button en Kotlin

Quiero hacer una request en mi aplicación de Android cuando se hace clic en el button. En Python podría hacer esto así:

import requests params = { 'param1':some_string, 'param2':some_int, 'param3':another_string } requests.post("https://some.api.com/method/some.method", params=params) 

Me gustaría hacer lo mismo en Kotlin cuando presiono el button. Intenté hacer tp con Fuel y khhtp, pero no tuve mucho éxito: la aplicación se bloqueó tan pronto como presioné el button y me encargué de enviar la request.

UPD: lo que utilicé:

AndroidManifest.xml

 ... <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> ... 

build.gradle

 dependencies { ... compile 'com.github.jkcclemens:khttp:0.1.0' ... } 

MainActivity.kt

 fun request(){ var message = "message" var uid = "123456" //I wanted to use it as int, but mapOf didn't allow me var token = "token" val payload = mapOf("token" to token, "user_id" to uid, "message" to message) get("https://some.api.com/method/some.method", params=payload) val popup = Toast.makeText(this,"Message sent!",Toast.LENGTH_LONG) popup.show() } 

activity_main.xml

 <Button ... android:onClick="request" /> 

Este es el ejemplo con khhtp, el que tiene Fuel se ha ido.

UPD2. Parte de la salida de Logcat:

enter image description here enter image description here

Solo necesita mirar el seguimiento de la stack para encontrar el problema. El código arroja una NetworkOnMainThreadException . Esto sucede cuando intenta acceder a la networking desde el hilo principal de Android (a menudo llamado UI). Esta pregunta tiene algunas buenas respuestas sobre este tema, sin embargo, en lugar de tratar de usar AsyncTask asegúrese de leer la documentation de la biblioteca de networking elegida y ver cómo realizar la llamada en un hilo diferente.

No estoy seguro de si esta es la raíz de su problema, pero la firma de su método de request debe ser:

 fun request(view: View) { } 

Como otros miembros respondieron que su código llama operación de networking en el hilo principal es por eso que está fallando. Puedes evitar esto usando Koutlin Coroutines o usando methods de Anko Library (que oficialmente es compatible con kotlin para simplificar las cosas en android). Aquí solo doy una reference sobre cómo hacer una llamada Asincrónica en Anko .

 doAsync { // Call all operation related to network or other ui blocking operations here. uiThread { // perform all ui related operation here } } 

Para hacerlo como Kotlin Coroutines, puede consultar esta respuesta:

Kotlin Coroutines el path correcto en Android

  • Faltan numbers de línea en playstore crashdumps
  • Habitación Kotlin +: java.lang.IllegalArgumentException: void no se puede convertir en un elemento
  • Declaraciones en el constructor de Kotlin
  • Recepción de parameters de formulario en el server de Ktor
  • ¿Cómo puedo volver a dibujar un Anko frameLayout cuando cambia mi model?
  • Argumento de la function Kotlin sin anotación de tipo
  • Kotlin comstack para javascript indestructible
  • Kotlin Cualquiera con lambdas
  • ¿Cuál es mejor object o function superior en Kotlin?
  • ¿Cómo build buffers de protocolo de Google y Kotlin usando Gradle?
  • Compile Groovy y Kotlin?