内部功能不影响外部功能的变量

时间:2019-05-31 14:11:03

标签: android kotlin

因此,我正在使用AsyncHTTPClient进行呼叫并检查用户是否已通过身份验证。我有一个布尔“已认证”来检查它们是否是,并想在onSuccess内部更改其值,但是onSuccess似乎并没有影响外部已认证的值,我对为什么感到非常困惑。

我可以确认它确实进入了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只是一个测试整数,这里的结果是a仍然为1,authenticated仍然为null,并且它也返回null。

1 个答案:

答案 0 :(得分:3)

它是null,因为onSuccess方法是异步调用的,这意味着在您尝试访问authenticated的值之前没有调用该方法,因此仍然是这样。 t已初始化。

解决此问题的方法之一是创建另一个函数,例如:

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

然后从onSuccess方法调用该方法,当然不会在UI线程上调用该方法,因此请注意不要直接在此方法内修改UI的任何部分。

相关问题