所以,这就是问题所在:
我的应用程序调用第三方库中的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()
}
}
我希望只有在回调方法执行完毕后,应用程序函数才会返回。我在想,使用启动会使在java库中创建的所有线程都属于同一个协程范围,joinAll((会等待。显然,我错了。
这是可以实现的吗?如果是,如何?
感谢您的帮助。
使用协程执行此操作的标准方法是使用suspendCoroutine((或suspendCancellableCorousine((。它们都暂停等待恢复的执行(例如从回调(,不同之处在于后者还支持在等待时取消。我建议阅读可取消变体的文档,因为那里的文档要好得多。
suspendCoroutine()
:示例
suspendCoroutine<Unit> { continuation ->
functionA(
{ continuation.resume(Unit) },
{ continuation.resumeWithException(it) }
)
}
请注意,要使用上面的函数,您的函数必须是一个挂起函数。在您的问题中,appFunction()
是一个正则函数,因此它不能挂起或等待任何东西。从技术上讲,您可以使用runBlocking()
,但如果您计划阻塞线程,那么我认为使用协程没有太大意义——您可以只使用回调。