您好我正在使用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,这不是正确值......
答案 0 :(得分:0)
您在for
循环中声明变量,因此它只会在该循环内可见。要使其对函数内的所有代码可见,请在函数范围内声明它。为了能够稍后更改值,请使用var
代替val
。 val
类似于Java final
:该值只能分配一次。
答案 1 :(得分:0)
&#34;正确的价值&#34;对makeText
的调用是在您的侦听器内进行的,该侦听器是异步调用的 - 在收到对GET请求的响应之后。这就是它始终显示正确价值的原因。
&#34;错误的价值&#34;对makeText
的调用是同步的(通常在收到对GET请求的响应之前)。这就是为什么它(几乎)总是会显示错误的值(即使value100
在范围内)。