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
。