未解决的参考

你好,我正在使用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(){后声明变量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() } 

在这种情况下,我得到第一个吐司正确的价值,第二我得到0这是不正确的价值…

你在for循环中声明变量,因此它只会在循环中可见。 为了使该函数内的所有代码都可见,请在函数作用域中声明它。 为了能够稍后更改值,请使用var而不是valval类似于Java的final :值只能被赋值一次。

makeText的“正确值”调用是在收到对GET请求的响应之后 ,在您的侦听器中进行的,这个调用是异步调用的。 这就是为什么它总是显示正确的价值。

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