【问题标题】:Kotlin fun returning prematurelyKotlin 的乐趣过早回归
【发布时间】: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


【解决方案1】:

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
    }    
}   

正如我在 cmets 中所说,在 Kotlin 中,使用 camelCase 也是一种约定,因此使用 usernameInput 代替 username_input

【讨论】:

    猜你喜欢
    • 2019-07-23
    • 2018-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-08
    • 2012-10-24
    • 2010-12-24
    • 2013-11-26
    相关资源
    最近更新 更多