所以,问题是:
我的应用程序在第三方库中调用一个functionA,该库创建自己的线程并调用该线程中的调用方。我想要做的是从我的应用程序中的一个函数调用那个functionA,等待回调被调用,然后退出我的函数。我试着用runBlocking,withContext等,但没有用。
下面是一个代码片段。
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()
}
}我希望只有在回调方法完成执行之后,app函数才返回。我认为使用启动将使java库中创建的所有线程都成为同一个协同作用域的一部分,而joinAll()则会对此等待。很明显我错了。
这是可以实现的吗?如果是这样的话,是怎么做的?
任何帮助都是非常感谢的。
发布于 2022-07-29 08:32:08
使用协同服务的标准方法是使用suspendCoroutine()或suspendCancellableCoroutine()。它们都挂起等待恢复的执行(例如,从回调),不同的是后者还支持在等待时取消。我建议阅读可取消变体的文档,因为文档在那里要好得多。
使用suspendCoroutine()的示例
suspendCoroutine<Unit> { continuation ->
functionA(
{ continuation.resume(Unit) },
{ continuation.resumeWithException(it) }
)
}注意,要使用上面的函数,您的函数必须是挂起函数。在您的问题中,appFunction()是一个常规函数,因此它不能挂起或等待任何东西。从技术上讲,您可以使用runBlocking(),但是如果您计划阻塞线程,那么我认为使用coroutines没有多大意义--您可以只使用回调。
https://stackoverflow.com/questions/73161522
复制相似问题