【问题标题】:Make HTTP request on button click in Kotlin在 Kotlin 中单击按钮时发出 HTTP 请求
【发布时间】:2018-05-11 00:44:15
【问题描述】:

单击按钮时,我想在我的 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 中做同样的事情。我尝试使用Fuelkhhtp 执行此操作,但没有成功——我一按下按钮,应用程序就崩溃了,负责发送请求。

UPD:我使用了什么:

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" />

这是 khhtp 的例子,Fuel 的例子不见了。

UPD2。部分Logcat输出:

【问题讨论】:

  • 我没有使用过你提到的库,但如果可以的话,请尝试使用 Retrofit 2。还请编辑并放置你尝试过的代码,以便其他用户指出你的错误。跨度>
  • 您能否添加您正在尝试的代码,以帮助我们确定崩溃原因?
  • 有了@Debnjan Volley 的建议,也是不错的选择
  • 这可能是因为在Android上你不能在主线程中进行网络调用。你能发布你的 logcat 输出吗?
  • @crgarridos ,完成

标签: android kotlin


【解决方案1】:

我找到了答案,基本上发生的事情是您无法在主线程上运行互联网连接,要覆盖,请将以下内容添加到用户正在执行网络操作的类中:

StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);

参考 (https://www.educative.io/edpresso/how-to-fix-androidosnetworkonmainthreadexception-error)

【讨论】:

    【解决方案2】:

    正如其他成员回答的那样,您的代码正在主线程上调用网络操作,这就是它崩溃的原因。您可以通过使用Kotlin Coroutines 或使用 Anko 库的方法来避免这种情况(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 the right way in Android

    【讨论】:

      【解决方案3】:

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

      fun request(view: View)
      {
      
      }
      

      【讨论】:

        【解决方案4】:

        您只需要查看堆栈跟踪即可找到问题。代码抛出NetworkOnMainThreadException。当您尝试从 Android 的主(通常称为 UI)线程中访问网络时,就会发生这种情况。这个question 对此问题有一些很好的答案,但是不要尝试使用AsyncTask,请务必阅读您选择的网络库的文档并了解如何在不同的线程上进行调用。

        【讨论】:

          猜你喜欢
          • 2013-04-20
          • 1970-01-01
          • 2015-03-06
          • 1970-01-01
          • 1970-01-01
          • 2017-08-30
          • 1970-01-01
          • 2017-03-10
          • 2019-12-10
          相关资源
          最近更新 更多