Kotlin过早返回乐趣

我正在尝试使用Kotlin开始Android开发。 我试图做的一部分是从我的登录活动发送一个HTTP请求,并从响应采取适当的行动。 我为此使用燃料 。

当点击“登录”按钮时,我打电话给以下fun

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

这工作正常。 然后我做我的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 } } 

问题是,当我收到一个错误,我似乎无法重新启用用户界面。 显示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 )并且不再继续。 它确实启用了用户名输入,所以我知道分配是成功的,但我不明白为什么它不继续启用其余的用户界面。

我怀疑这与我从异步操作中调用它的事实有关,但是我一直没能find任何其他的方式来做到这一点。

有没有特别的方法我应该调用enableInput ,或者这是完全错误的方式去呢?

UI代码必须在Android的UI线程中运行。

disableInput函数响应于按钮点击而运行,所以它已经在UI线程中,但是当你处理HTTP响应时,Fuel将在不同的线程中运行你的回调。

要更改回UI线程来更新您的UI组件,请使用View::post ,如下所示:

 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中,使用camelCase也是一个约定,所以不要使用usernameInput ,而要使用usernameInput