【发布时间】:2018-09-26 04:12:26
【问题描述】:
目前,我有一些类似 this 的场景,其中我有类似这样的 java 接口回调。
Java 回调
interface Callback<T> {
void onComplete(T result)
void onException(HttpResponse response, Exception ex)
}
上面的挂起函数是这样的
suspend inline fun <T> awaitCallback(crossinline block: (Callback<T>) -> Unit) : T =
suspendCancellableCoroutine { cont ->
block(object : Callback<T> {
override fun onComplete(result: T) = cont.resume(result)
override fun onException(e: Exception?) {
e?.let { cont.resumeWithException(it) }
}
})
}
我的调用函数是这样的
fun getMovies(callback: Callback<Movie>) {
launch(UI) {
awaitCallback<Movie> {
// I want to delegate exceptions here.
fetchMovies(it)
}
}
我目前正在做的是捕获异常
fun getMovies(callback: CallbackWrapper<Movie>) {
launch(UI) {
try{
val data = awaitCallback<Movie> {
// I want to delegate exceptions here.
fetchMovies(it)
}
callback.onComplete(data)
}catch(ex: Exception) {
callback.onFailure(ex)
}
}
}
// I have to make a wrapper kotlin callback interface for achieving the above
interface CallbackWrapper<T> {
fun onComplete(result: T)
fun onFailure(ex: Exception)
}
问题
以上方法可行,但有更好的方法吗?主要的事情之一是我目前正在从回调中迁移这段代码,所以我有大约 20 个 api 调用,我不想在任何地方添加
try/catch来委托结果以及异常。另外,我只能从我的挂起函数中获得
exception,有没有办法同时获得HttpResponse以及异常。或者是否可以使用现有的JAVA接口。有没有更好的方法可以在不使用回调的情况下从
getMovies委托结果??
【问题讨论】:
-
您在此处发布的代码不起作用...
inline丢失,object : Callback<T>和界面不匹配...除此之外...我可能真的不明白为什么您正在使用该构造...不会像以下内容就足够了吗?fun getMovies(callback: Callback<Movie>) = GlobalScope.launch(UI) { val job = async { fetchMovies() }; job.getCompletionExceptionOrNull()?.apply(callback::onException); job.await().forEach(callback::onComplete) }(注意我使用的是 Kotlin 1.3)? -
我不能使用异步。我必须使用我在上面创建的
awaitCallback函数 bcz 我将 java 回调包装在一个挂起函数中。 -
“我必须使用
awaitCallback[...] bcz 我将 java 回调包装在一个挂起函数中”是什么意思?在之前的评论中我也做了同样的事情,但我使用了async作为示例......请注意传递给launch的块函数已经是suspend函数。因此,如果您使用suspendCancellableCoroutine的唯一原因是调用不是suspend的函数,您可以省略它而只使用launch的块函数,它本身就是suspend函数。或者你为什么在这里使用suspendCancellableCoroutine? -
顺便说一句:你写了“上面的作品”(没有显示我使用它仍然会遇到一些编译错误)......你在
fetchMovies-function中做了什么? -
好的...实际上我在评论中的代码是错误的(但是不是很多);-) 应该事先测试过...仍然...我很难理解为什么会这样
awaitCallback/suspendCancellableCoroutine真的很需要。
标签: java kotlin kotlinx.coroutines