首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >无法在android Kotlin函数中返回来自API GET请求的响应

无法在android Kotlin函数中返回来自API GET请求的响应
EN

Stack Overflow用户
提问于 2020-12-17 18:22:45
回答 1查看 786关注 0票数 0

我目前正试图在Kotlin的android工作室开发一个android应用程序。我使用RESTful API在应用程序中获取/发布数据到MSSQL数据库。

在android中,我创建了一个函数,使用Volley向API发送一个GET请求,并以JsonArray格式返回来自API的响应。

我遇到的问题是响应是空的(/skipped),这会导致返回一个空的JsonArray。

该职能如下:

代码语言:javascript
运行
复制
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在Postman中工作并返回所需的JsonArray。但是在这个函数中,响应不是空的就是跳过的。在调试模式下,它完全跳过第8行到第11行,从而返回一个空的JsonArray。

我还试图首先在单个JsonObjects中分解响应,并将其添加到JsonArray中,如下所示:

代码语言:javascript
运行
复制
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        }

但没有结果。

我有一种感觉,安卓演播室内置的多线程可能是我问题的原因。但我不确定。

如果有人知道解决我的问题的办法,我会很高兴听到的。即使是朝正确的方向推进也是值得赞赏的。

提前谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-12-17 18:36:20

不能同步返回结果。你必须用异步的方式来做。试试这个,我只是稍微修改了一下你的代码。

代码语言:javascript
运行
复制
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)时,它不会等待调用结束。这就是为什么我们必须使用回调方法,以便当结果准备就绪时,它可以通过回调将结果传递给我们。

回调(响应)和回调(Null)就是这样做的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65346291

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档