在Kotlin按钮上点击HTTP请求

我想在按钮被点击时在我的android应用程序中发出请求。 在Python中,我可以这样做:

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

当我按下按钮时,我想在Kotlin中做同样的事情。 我试图用燃料和khhtp这样做,但没有成功很多 – 应用程序崩溃,只要我按下按钮,负责发送请求。

UPD:我用什么:

AndroidManifest.xml中

 ...   ... 

的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中

 

这是khhtp的例子,Fuel中的那个没了。

UPD2。 Logcat输出的一部分:

在这里输入图像说明 在这里输入图像说明

你只需要看堆栈跟踪来find问题。 该代码抛出一个NetworkOnMainThreadException 。 当您尝试从Android主(通常称为UI)线程内访问网络时,会发生这种情况。 这个问题有关于这个问题的一些很好的答案,但是不要尝试使用AsyncTask确保阅读你选择的网络库的文档,看看如何在不同的线程上进行调用。

我不确定这是否是问题的根源,但您的请求方法签名应该是:

 fun request(view: View) { } 

当其他成员回答你的代码正在主线程调用网络操作,这就是为什么它崩溃。 你可以通过使用Kotlin Coroutines或者使用Anko Library(这是kotlin正式支持的方法来简化android中的东西)的方法来避免这种情况。 在这里,我只是给如何在Anko做异步调用的参考。

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

要做到Kotlin Coroutines,你可以参考这个答案:

Kotlin Coroutines是Android的正确方法