首页 > 解决方案 > 我可以将回调函数包装到另一个函数中以从中返回值吗?

问题描述

我有一个服务器请求(我正在使用 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吗?如果是这样,我该怎么办?

标签: jsonkotlinrequest

解决方案


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

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 中的代码。

您也可以考虑使用协程,但是在这里的答案中从头开始解释太多了。


推荐阅读