【发布时间】:2017-10-25 13:45:26
【问题描述】:
我正在尝试开始使用 Kotlin 进行 Android 开发。我正在尝试做的部分事情是从我的登录活动中发送一个 HTTP 请求,并从响应中采取适当的行动。我为此使用Fuel。
当点击“登录”按钮时,我正在调用以下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
}
}
问题是当我收到错误时,我似乎无法重新启用 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,还是这完全是错误的方式?
【问题讨论】:
-
您可能需要更改到 UI 线程才能更改 UI 组件。见view.post()
-
还有一个小细节:在 Kotlin 代码中更喜欢使用 snakeCase(例如
usernameInput,而不是username_input)。 -
@Renato 做到了,谢谢!如果您添加答案,我会将其标记为已接受。并感谢您的提示!这对我来说还是很新鲜的。
-
添加了答案 :) 祝你好运。
标签: android asynchronous kotlin