2017-10-25 3 views
1

私はコトリンを使ってAndroid開発を始めようとしています。私がしようとしていることの一部は、ログインアクティビティからHTTP要求を送信し、応答から適切な処置をとることです。私はFuelを使っています。これは正常に動作します早速返されたコトリンの楽しみ

private fun disableInput() { 
    username_input.isEnabled = false 
    password_input.isEnabled = false 
    sign_in_button.isEnabled = false 
    login_progress.visibility = View.VISIBLE 
} 

:「サインイン」ボタンをタップする

、私は次のようfunを呼んでいます。私はその後、私のHTTPリクエストを行います。

"http://my.login.url.com".httpPost() 
    .header("Content-Type" to "application/json") 
    .body(json, Charsets.UTF_8) 
    .response(AuthorizationSuccess.Deserializer()) { _, response, result -> 
     val (auth, error) = result 

     if (error != null || auth == null) { 
      Snackbar.make(view, "Error", 0).show() 
      enableInput() 
     } else { 
      // Handle the response 
     } 
    } 

問題は、私はエラーを受信したとき、私はUIを再度有効にするように見えることができないということです。 Snackが表示され、enableInputが呼び出されます。

private fun enableInput() { 
    username_input.isEnabled = true 
    password_input.isEnabled = true 
    sign_in_button.isEnabled = true 
    login_progress.visibility = View.GONE 
} 

しかし、それは最初の行のみ(username_input.isEnabled = true)をヒットし、それ以上になりません。私は割り当てが成功していることを知っているので、ユーザー名の入力を有効にしますが、UIの残りの部分を有効にする理由がわからないことがわかりません。

私はそれが非同期操作から呼び出されているということとは関係がありますが、私はそれを行う他の方法を見つけることができませんでした。

enableInputと呼ぶべき特別な方法はありますか、これについては完全に間違った方法ですか?

+1

UIコンポーネントを変更するには、おそらくUIスレッドに変更する必要があります。 [view.post()](https://developer.android.com/reference/android/view/View.html#post(java.lang.Runnable)) – Renato

+1

ちょっとした詳細:snakeCase Kotlinコードで 'username_input'ではなく' usernameInput'など)。 – Renato

+0

@レナートそう、ありがとう!あなたが答えを加えると、私はそれを受け入れられたものとしてマークします。そして、チップのおかげで!これはまだ私にとって全く新しいものです。 –

答えて

2

UIコードはAndroidのUIスレッドで実行する必要があります。

disableInputファンクションはボタンクリックに応答して実行されるため、すでにUIスレッドにありますが、HTTP応答を処理すると、Fuelは別のスレッドでコールバックを実行します。 、View::postを使用し、あなたのUIコンポーネントを更新するために戻ってUIスレッドに、このようなものに変更するには

:私はコメントで言ったように

private fun enableInput() { 
    username_input.post { 
     username_input.isEnabled = true 
     password_input.isEnabled = true 
     sign_in_button.isEnabled = true 
     login_progress.visibility = View.GONE 
    }  
} 

は、Kotlinで、それはまた、キャメルケースを使用するための慣習ですのでusername_inputの代わりにusernameInputを使用してください。

関連する問題