Kotlin结构化并发:当java库在单独的线程中运行时,阻塞调用



所以,这就是问题所在:

我的应用程序调用第三方库中的functionA,该库创建自己的线程并回调该线程中的调用者。我想做的是从我的应用程序中的一个函数调用functionA,等待回调被调用,然后退出我的函数。我试着使用runBlockingwithContext等,但都没有用。

下面是一个代码片段。


fun appFunction(context: Context) {
// call library function `functionA` which calls back the success and failure callbacks in a separate java thread.
runBlocking {
launch { functionA({ Timber.i("Call Success") }, { Timber.e(it) }) }
joinAll()
}
}

我希望只有在回调方法执行完毕后,应用程序函数才会返回。我在想,使用启动会使在java库中创建的所有线程都属于同一个协程范围,joinAll((会等待。显然,我错了。

这是可以实现的吗?如果是,如何?

感谢您的帮助。

使用协程执行此操作的标准方法是使用suspendCoroutine((或suspendCancellableCorousine((。它们都暂停等待恢复的执行(例如从回调(,不同之处在于后者还支持在等待时取消。我建议阅读可取消变体的文档,因为那里的文档要好得多。

suspendCoroutine():示例

suspendCoroutine<Unit> { continuation ->
functionA(
{ continuation.resume(Unit) },
{ continuation.resumeWithException(it) }
)
}

请注意,要使用上面的函数,您的函数必须是一个挂起函数。在您的问题中,appFunction()是一个正则函数,因此它不能挂起或等待任何东西。从技术上讲,您可以使用runBlocking(),但如果您计划阻塞线程,那么我认为使用协程没有太大意义——您可以只使用回调。

相关内容

最新更新