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



我有一个服务器请求(我正在使用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
}
}

但是响应对象仍然null。我说得对onComplete函数没有时间填充responseObject?如果是这样,我该怎么办?

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

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

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

最新更新