未解决的参考

时间:2017-06-28 20:39:02

标签: android kotlin

您好我正在使用Kotlin和Android Studio当我尝试运行我的代码时出现此错误:未解决的参考。这是我的代码:

private fun loadLocation(){

    val stringRequest = StringRequest(Request.Method.GET,
            "localhost",
            Response.Listener<String> { s ->
                try {
                    val obj = JSONObject(s)
                    val array = obj.getJSONArray("response")

                    for (i in 0..array.length() - 1) {
                        val objectArtist = array.getJSONObject(i)
                        val value = objectArtist.getString("value")

                        val value100 = value.toDouble()

                    }
    //This line below displays the right value

      Toast.makeText(getApplicationContext(), value100.toString(), Toast.LENGTH_LONG).show()

                } catch (e: JSONException) {
                    e.printStackTrace()
                }
            }, Response.ErrorListener { volleyError -> Toast.makeText(applicationContext, volleyError.message, Toast.LENGTH_LONG).show() })

    val requestQueue = Volley.newRequestQueue(this)
    requestQueue.add<String>(stringRequest)

    //This line below displays the wrong value

    Toast.makeText(getApplicationContext(), value100.toString(), Toast.LENGTH_LONG).show()



}

问题在于:如果我正在看这一行:

Toast.makeText(getApplicationContext(), value100.toString(), Toast.LENGTH_LONG).show()

第一行显示第一次的好值,但是如果我在代码末尾尝试这一行它不起作用...我尝试在private fun loadLocation(){之后声明变量但是当我尝试显示时我得到了0.我绝对需要获得变量的值。谢谢你的帮助!

编辑:

我也尝试了这段代码:

private fun loadLocation(){

                        var value100 = 0


    val stringRequest = StringRequest(Request.Method.GET,
            "localhost",
            Response.Listener<String> { s ->
                try {
                    val obj = JSONObject(s)
                    val array = obj.getJSONArray("response")

                    for (i in 0..array.length() - 1) {
                        val objectArtist = array.getJSONObject(i)
                        val value = objectArtist.getString("value")

                        value100 = value.toDouble()

                    }
    //This line below displays the right value

      Toast.makeText(getApplicationContext(), value100.toString(), Toast.LENGTH_LONG).show()

                } catch (e: JSONException) {
                    e.printStackTrace()
                }
            }, Response.ErrorListener { volleyError -> Toast.makeText(applicationContext, volleyError.message, Toast.LENGTH_LONG).show() })

    val requestQueue = Volley.newRequestQueue(this)
    requestQueue.add<String>(stringRequest)

    //This line below displays the wrong value

    Toast.makeText(getApplicationContext(), value100.toString(), Toast.LENGTH_LONG).show()



}

在这种情况下,我得到第一个Toast正确值,第二个得到0,这不是正确值......

2 个答案:

答案 0 :(得分:0)

您在for循环中声明变量,因此它只会在该循环内可见。要使其对函数内的所有代码可见,请在函数范围内声明它。为了能够稍后更改值,请使用var代替valval类似于Java final:该值只能分配一次。

答案 1 :(得分:0)

&#34;正确的价值&#34;对makeText的调用是在您的侦听器内进行的,该侦听器是异步调用的 - 在收到对GET请求的响应之后。这就是它始终显示正确价值的原因。

&#34;错误的价值&#34;对makeText的调用是同步的(通常在收到对GET请求的响应之前)。这就是为什么它(几乎)总是会显示错误的值(即使value100在范围内)。