我可以将回调函数包装到另一个函数中以从中返回值吗?

时间:2020-05-13 16:44:39

标签: json kotlin request

我有一个到服务器的请求(我正在使用VK SDK)。因此,我想将所有内容移动到另一个位置,然后调用它并获得响应。 这是我现在拥有的:

object GetAlbumsService {
    fun getAlbums():GetAlbumsResponse{
        lateinit var responseObject: GetAlbumsResponse
        val request = VKRequest("photos.getAlbums", VKParameters.from("need_system", "1"))
        request.executeWithListener(object: VKRequest.VKRequestListener(){
            override fun onComplete(response: VKResponse?) {
                responseObject = Gson().fromJson(response?.json.toString(), GetAlbumsResponse::class.java)
            }
        })
        return responseObject
    }
}

但是responseObject仍然为null。我对onComplete函数没有时间填写responseObject感到正确吗?如果可以,该怎么办?

1 个答案:

答案 0 :(得分:1)

您不能从启动后台工作的函数中返回异步回调的结果。但是您可以允许调用函数传递回调。

fun getAlbums(onComplete: (GetAlbumsResponse) -> Unit) {
        val request = VKRequest("photos.getAlbums", VKParameters.from("need_system", "1"))
        request.executeWithListener(object: VKRequest.VKRequestListener(){
            override fun onComplete(response: VKResponse?) {
                responseObject = Gson().fromJson(response?.json.toString(), GetAlbumsResponse::class.java)
                onComplete(responseObject)
            }
        })
    }

然后从这里调用它:

GetAlbumsService.getAlbums { response ->
    // Do something with response
}

准备好结果后,将调用代码lambda。

您也可以研究使用协程,但这在这里的答案中无法从头开始解释。