2017-11-27 19 views
0

にあるボタンをクリックしたときに、HTTPリクエストを作成します。 Pythonでは、次のようにすることができます:は、私はボタンがクリックされたときに、私のAndroidアプリでリクエストを作りたいKotlin

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

私はボタンを押したときに同じことをしたいと思います。私はFuelkhhtpでこれを行うtpを試みたが、私はボタンを押して、要求を送信するための責任を負うとすぐにアプリがクラッシュした。

UPD:私が使用したもの:activity_main.xml

の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() 
} 
<Button 
... 
    android:onClick="request" /> 

これはkhhtpを使用した例です.Fuelを使用した例はなくなりました。

UPD2。 Logcat出力の一部:

enter image description here enter image description here

+1

私はあなたが言及したライブラリを使用していますが、可能性がある場合は、レトロフィット2としようとしておらず、他のユーザーがあなたの間違いを指摘できるように、試したコードを編集して入れてください。 – Debanjan

+0

あなたが特定したコードを追加して、クラッシュの原因を特定するのに役立ちますか? – pRaNaY

+0

@Debnjan Volleyの提案でも良いと簡単なオプションです –

答えて

0

あなただけの問題を見つけるために、スタックトレースを見てする必要があります。コードはNetworkOnMainThreadExceptionを投げています。これは、Androidのメイン(通常はUIと呼ばれる)スレッド内からネットワークにアクセスしようとするときに発生します。このquestionは、この問題について、いくつかの良い答えを持っている、しかし、代わりに選択したネットワークライブラリのマニュアルを読み、別のスレッドで呼び出しを行う方法を確認してくださいAsyncTaskを使用しようとしています。

0

私はこれがあなたの問題の根があるのか​​はわからないが、あなたのリクエストメソッドのシグネチャは次のようになります。他のメンバーがあなたのコードは、それがクラッシュした理由ですメインスレッド上のネットワーク操作を呼び出している答えのよう

fun request(view: View) 
{ 

} 
0

Kotlin Coroutinesを使用するか、またはAnkoライブラリのメソッドを使用して、これを回避することができます(これは、アンドロイドを簡略化するためにkotlinによって正式にサポートされています)。ここでは、Ankoで非同期呼び出しを行う方法のリファレンスを提供します。

doAsync { 

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

Kotlinコルーチンとしてそれを行うには、あなたがこの回答を参照することができます: -

Kotlin Coroutines the right way in Android

関連する問題