Внутренняя функция не влияет на переменную вне функции - PullRequest
2 голосов
/ 31 мая 2019

Поэтому я использую AsyncHTTPClient, чтобы позвонить и проверить, прошел ли аутентификация пользователя.У меня есть логическое «authenticated», чтобы проверить, если они есть, и я хочу изменить его значение внутри onSuccess, однако onSuccess, похоже, не влияет на значение authenticated outside, и я очень смущен, почему.

Я могу подтвердить, что это действительно входит в оператор if, поэтому ответ, который я получаю, является правильным.Я новичок в Kotlin, однако что-то подобное в Java работает так, как я сейчас перехожу.

Это мой код:

    fun authenticate(username: String, password: String): Boolean? {
        var params = RequestParams()
        params.put("username", username)
        params.put("password", password)
        var authenticated: Boolean? = null
        var a: Int = 1

        //Encrypt password and stuff

        restClient.get("/authenticate", params, object : JsonHttpResponseHandler(){
            override fun onSuccess(statusCode: Int, headers: kotlin.Array<out Header>?, response: JSONObject?) {
                if(response == null) {Log.d("no response", "404")}
                else if (response.get("success").toString() == "true") {
                    authenticated = true
                    a = a + 1
                    Log.d("authenticatedInside", a.toString())
                    Log.d("authenticatedInside", authenticated.toString())
                }
            }
        })

        Log.d("authenticated", a.toString())
        Log.d("authenticated", authenticated.toString())
        return authenticated
    }

AuthenticatedInside дает правильные значения.

a - это просто целое число теста, результат здесь равен 1, проверка подлинностивсе еще ноль, и это также возвращает ноль.

1 Ответ

3 голосов
/ 31 мая 2019

Это null, потому что метод onSuccess вызывается асинхронно, это означает, что метод не вызывается до того, как вы попытаетесь получить доступ к значению authenticated, и поэтому он по-прежнему не инициализирован.

Один из способов исправить это - создать другую функцию, например:

fun onAuthenticateResult(authenticated : Boolean){
   // Write what you want to do with authenticated here
}

Затем вызовите этот метод из метода onSuccess, конечно, он не будет вызываться в потоке пользовательского интерфейса, поэтому будьте осторожны, чтобы не изменять напрямую какую-либо часть вашего пользовательского интерфейса внутри этого метода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...