【问题标题】:Not able to return the response from an API GET request in a android Kotlin function无法从 android Kotlin 函数中的 API GET 请求返回响应
【发布时间】:2021-03-28 11:21:32
【问题描述】:

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

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

我遇到的问题是响应是空的(/跳过),这导致返回一个空的 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 有效并在 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 studio 中的内置多线程可能是我的问题的原因。但我不确定。

如果有人知道我的问题的修复或解决方案,我很乐意听到。或者即使是朝着正确的方向推动也是值得赞赏的。

提前致谢。

【问题讨论】:

    标签: android android-studio kotlin get android-volley


    【解决方案1】:

    您不能同步返回结果。您必须以异步方式进行。试试这个,我只是稍微修改了你的代码。

    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 还很陌生,并且真的不知道在调用函数时应该给出什么参数。您能否解释或详细说明它现在的作用?
    • @M.Kruisselbrink 我已经更新了答案。请检查。
    猜你喜欢
    • 1970-01-01
    • 2020-07-07
    • 1970-01-01
    • 1970-01-01
    • 2016-11-28
    • 2019-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多