Kotlin весело возвращается преждевременно

Я пытаюсь начать работу с Android, используя Kotlin. Часть того, что я пытаюсь сделать, это отправить 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 } } 

Проблема в том, что когда я получаю сообщение об ошибке, я не могу повторить включение пользовательского интерфейса. enableInput « 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 ) и не идет дальше. Он позволяет вводить имя пользователя, поэтому я знаю, что назначение преуспевает, но я не могу понять, почему он не переходит к остальной части пользовательского интерфейса.

Я подозреваю, что это связано с тем, что я называю это асинхронной операцией, но я не смог найти другого способа сделать это.

Есть ли специальный способ, которым я должен называть enableInput , или это совсем не так?

Код UI должен запускаться в потоке пользовательского интерфейса в Android.

Функция disableInput запускается в ответ на нажатие кнопки, поэтому она уже находится в потоке пользовательского интерфейса, но когда вы обрабатываете ответ HTTP, Fuel будет запускать ваш обратный вызов в другой теме.

Чтобы вернуться к теме 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 } } 

Как я уже сказал в комментариях, в Котлине это также соглашение использовать camelCase, поэтому вместо username_input используйте usernameInput .

Intereting Posts
Запуск контрольных тестов с значка игры в Android Studio запускает их как JUnit на JVM Каковы возможные значения, которые могут быть даны `@ Suppress` в Котлин? Kotlin – Ошибка: не удалось найти или загрузить основной класс _DefaultPackage Объявление функциональных литералов с типичными входными параметрами в Котлине Летучие свойства в Котлине? Kotlin – эквивалентность SomeClass.class для объектов? Kotlin getParcelableArray из комплекта намерений не может передать его пользовательскому типу Класс данных Kotlin Jackson @ JsonProperty не отмечен Получите результат от Observable – Kotin Android перейти к объявлению в приложении create-react-kotlin-app не работает Котлин – когда выражение с возвращаемым типом функции AppCompatActivity, ViewModel и привязка данных Что такое идиоматический способ Котлин, чтобы получить Логгера? Kotlin javaClass <> отсутствует зависимость в последней версии Android Studio 3.0 Gradle kotlin-spring плагин не открывает весенние классы