android - 如何使用 Kotlin 将 JsonObjectRequest 元素保存在变量中?
问题描述
我正在尝试从 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){
}
我不太了解第二个代码,但它仍然无法正常工作,响应变量始终为空,并且程序在该尝试中停留在无限循环中。
解决方案
如果你想使用emailGet
andusernameGet
变量,你应该在回调中进行:
val queue = Volley.newRequestQueue(this)
val jsonObjectRequest = JsonObjectRequest(
Request.Method.GET, url, null,
{ response ->
emailGet = response.getString("email")
usernameGet = response.getString("name")
// TODO do something with the variables here
}, { error ->
Toast.makeText(this, error.toString(), Toast.LENGTH_LONG).show()
}
)
queue.add(jsonObjectRequest)
相反,如果您有一个在收到响应后立即运行的方法方法doSomething()
:
fun doSomething(email:String, username:String){
// TODO do something with the variables here
}
您可以将第一个代码片段中的 TODO 注释替换为doSomething(emailGet, usernameGet)
.
的第 4 和第 5 个参数JsonObjectRequest
实际上是 和 类型的Response.Listener
对象Response.ErrorListener
。这两个侦听器是单一抽象方法接口。如果展开它会是这样的:
val jsonObjectRequest = JsonObjectRequest(
Request.Method.GET, url, null,
object : Response.Listener {
override fun onResponse(response: JSONObject) {
emailGet = response.getString("email")
usernameGet = response.getString("name")
doSomething(emailGet, usernameGet)
}
},
object : Response.ErrorListener {
override fun onErrorResponse(error: VolleyError) {
Toast.makeText(this, error.toString(), Toast.LENGTH_LONG).show()
}
}
)
您使用的 lambda 语法是 SAM 接口的简写。
推荐阅读
- python - 使用 Flask 将 CSV 文件显示为 HTML 页面
- sql-server - Wrapper TSQL 表值函数很慢
- php - 使用 PHP 的 YouTube API 出现“无效代码”错误
- javascript - VueJS 和 Ant Design - 更新输入字段
- mysql - MySQL - 相同的 SQL 查询很快,但在存储过程中很慢?
- javascript - 访问 Json 上的特定数据 - NodeJS
- c# - 为什么 MSBuild 在 Directory.Build.props 中找不到我的常量?
- r - 如果找到 0 X 次,则删除数据框中的行
- nginx - Nginx - 使用 proxy_cache_bypass 传递 proxy_cache 值
- java - 如何在 Swagger UI 中显示自定义 JSON?