【发布时间】:2021-10-06 07:08:04
【问题描述】:
我正在尝试从 mySQL 数据库中获取数据,而我的代码正确地获取了数据。 问题是我在 JsonObjectRequest 中有信息,但我无法使用它。我的想法是使用变量来保存我需要的一些信息。 像这样的:
val queue=Volley.newRequestQueue(this)
val jsonObjectRequest = JsonObjectRequest(
Request.Method.GET,url,null,
{ response ->
emailGet = response.getString("email")
usernameGet = response.getString("name")
}, { error ->
Toast.makeText(this, error.toString(), Toast.LENGTH_LONG).show()
}
)
queue.add(jsonObjectRequest)
正如我所说,这里的问题是 emailGet 和 usernameGet(在此代码块之前声明的变量)仅将值存储在 JsonObjectRequest 中,其中变量为空。 示例:
val queue=Volley.newRequestQueue(this)
val jsonObjectRequest = JsonObjectRequest(
Request.Method.GET,url,null,
{ response ->
emailGet = response.getString("email")
usernameGet = response.getString("name")
Toast.makeText(this, emailGet, Toast.LENGTH_LONG).show()
}, { error ->
Toast.makeText(this, error.toString(), Toast.LENGTH_LONG).show()
}
)
queue.add(jsonObjectRequest)
Toast.makeText(this, usernameGet, Toast.LENGTH_LONG).show()
这里 Toast 将只在屏幕上打印 emailGet 内容,因为它在 JsonObjectRequest 中,必须打印 usernameGet 值的 Toast 不会这样做。
查找信息我发现这个问题可能是因为这个函数是异步的,我在 Java 中找到了一个可能的解决方案,我尝试将其翻译为 Kotlin。
val queue=Volley.newRequestQueue(this)
val future : RequestFuture<JSONObject> = RequestFuture.newFuture()
val request = JsonObjectRequest(
Request.Method.GET, url, null, future, future)
queue.add(request)
try{
var response = future.get()
} catch (e : InterruptedException){
} catch (e : ExecutionException){
}
我不是很理解第二个代码,但它仍然无法正常工作,响应变量始终为空,并且程序在该尝试中停留在无限循环中。
【问题讨论】:
-
您说响应和错误回调是异步的是正确的,因此在您的第一个代码 sn-p 中,最终的 toast 语句可能在收到响应之前运行。如果您想使用
emailGet和usernameGet变量,您可能希望在回调中执行此操作。您是否有理由不想/不能这样做? -
@ttyip 嗨,是的,我需要在代码的其他部分使用它们。
-
“在其他部分使用它们”是指在收到响应后直接使用这些数据,还是希望存储它们并在需要时使用它们?前者很简单,只需将数据传递给使用变量的方法即可;对于后者,您需要持久存储它们并在以后检索它们。
-
@ttyip 在收到回复后我暂时需要它。如何将数据传递给其他方法?我什至不能在 JsonObjectRequest 下的相同方法中使用它
标签: android json kotlin mobile