无法在 android Kotlin 函数中 return 来自 API GET 请求的响应
Not able to return the response from an API GET request in a android Kotlin function
我目前正尝试在 Kotlin 的 android 工作室中开发一个 android 应用程序。我使用 RESTful API 到 GET/POST 数据往返于我的应用程序和 MSSQL 数据库。
在 android 工作室中,我创建了一个函数,使用 Volley 向 API 发送 GET 请求,并 returns 来自 API 的响应JsonArray 格式。
我遇到的问题是响应为空(/跳过),这导致返回一个空的 JsonArray。
函数如下所示:
1 fun apiGetRequest(context: Context, token: String?, id: String?): JsonArray {
2 val queue = Volley.newRequestQueue(context)
3 val url = "http://**.**.*.**:**/****/****?token=$token&id=$id"
4
5 var jsonArray = JSONArray()
6
7 val jsonArrayRequest = JsonArrayRequest(url, { response ->
8 jsonArray = response
9 }, {
10 //Error listener
11 })
12 queue.add(jsonArrayRequest)
13 return jsonArray
14}
此 GET 请求中使用的 URL 有效,returns Postman 中所需的 JsonArray。但是在这个函数中,响应要么为空要么被跳过。在调试模式下,它完全跳过第 8 行到第 11 行,这导致返回一个空的 JsonArray。
我也试过首先分解单个 JsonObjects 中的响应并将其添加到 JsonArray 中,如下所示:
7 val jsonArrayRequest = JsonArrayRequest(url, { response ->
8 for(i in 0 until response.length()) {
9 val jsonObject = response.getJSONObject(i)
10 jsonArray.put(jsonObject)
11 }
但是没有结果。
我感觉 android 工作室中的内置多线程可能是导致我出现问题的原因。但我不确定。
如果有人知道我的问题的修复或解决方案,我会很乐意听到。甚至向正确方向的推动表示赞赏。
提前致谢。
您不能return同步结果。您必须以异步方式进行。试试这个,我只是稍微修改了你的代码。
fun apiGetRequest(context: Context, token: String?, id: String?, callback: (result: JSONArray) -> Unit) {
val queue = Volley.newRequestQueue(context)
val url = "http://**.**.*.**:**/****/****?token=$token&id=$id"
//var jsonArray = JSONArray()
val jsonArrayRequest = JsonArrayRequest(url, { response ->
// jsonArray = response
callback(response)
}, {
//Error listener
callback(null)
})
queue.add(jsonArrayRequest)
}
Now you can call this method like this...
apiGetRequest(context ,"your token","your id" ) {
if(it!=null){
// println(it)
// do what you want to do with the jsonarray
}
else{
// show some error message to user or whatever.
}
}
这样,它是异步工作的。在 apiGetRequest 方法中,当它调用 queue.add(jsonArrayRequest) 时,它不会等待调用结束。这就是为什么我们必须使用回调方法,以便当结果准备好时,它可以通过回调将结果传递给我们。
回调(响应)和
callback(null) 正在这样做。
我目前正尝试在 Kotlin 的 android 工作室中开发一个 android 应用程序。我使用 RESTful API 到 GET/POST 数据往返于我的应用程序和 MSSQL 数据库。
在 android 工作室中,我创建了一个函数,使用 Volley 向 API 发送 GET 请求,并 returns 来自 API 的响应JsonArray 格式。
我遇到的问题是响应为空(/跳过),这导致返回一个空的 JsonArray。
函数如下所示:
1 fun apiGetRequest(context: Context, token: String?, id: String?): JsonArray {
2 val queue = Volley.newRequestQueue(context)
3 val url = "http://**.**.*.**:**/****/****?token=$token&id=$id"
4
5 var jsonArray = JSONArray()
6
7 val jsonArrayRequest = JsonArrayRequest(url, { response ->
8 jsonArray = response
9 }, {
10 //Error listener
11 })
12 queue.add(jsonArrayRequest)
13 return jsonArray
14}
此 GET 请求中使用的 URL 有效,returns Postman 中所需的 JsonArray。但是在这个函数中,响应要么为空要么被跳过。在调试模式下,它完全跳过第 8 行到第 11 行,这导致返回一个空的 JsonArray。
我也试过首先分解单个 JsonObjects 中的响应并将其添加到 JsonArray 中,如下所示:
7 val jsonArrayRequest = JsonArrayRequest(url, { response ->
8 for(i in 0 until response.length()) {
9 val jsonObject = response.getJSONObject(i)
10 jsonArray.put(jsonObject)
11 }
但是没有结果。
我感觉 android 工作室中的内置多线程可能是导致我出现问题的原因。但我不确定。
如果有人知道我的问题的修复或解决方案,我会很乐意听到。甚至向正确方向的推动表示赞赏。
提前致谢。
您不能return同步结果。您必须以异步方式进行。试试这个,我只是稍微修改了你的代码。
fun apiGetRequest(context: Context, token: String?, id: String?, callback: (result: JSONArray) -> Unit) {
val queue = Volley.newRequestQueue(context)
val url = "http://**.**.*.**:**/****/****?token=$token&id=$id"
//var jsonArray = JSONArray()
val jsonArrayRequest = JsonArrayRequest(url, { response ->
// jsonArray = response
callback(response)
}, {
//Error listener
callback(null)
})
queue.add(jsonArrayRequest)
}
Now you can call this method like this...
apiGetRequest(context ,"your token","your id" ) {
if(it!=null){
// println(it)
// do what you want to do with the jsonarray
}
else{
// show some error message to user or whatever.
}
}
这样,它是异步工作的。在 apiGetRequest 方法中,当它调用 queue.add(jsonArrayRequest) 时,它不会等待调用结束。这就是为什么我们必须使用回调方法,以便当结果准备好时,它可以通过回调将结果传递给我们。
回调(响应)和 callback(null) 正在这样做。