首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Kotlin结构化并发:当java库在单独的线程中运行时阻塞调用。

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

Stack Overflow用户
提问于 2022-07-29 04:03:15
回答 1查看 64关注 0票数 0

所以,问题是:

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

下面是一个代码片段。

代码语言:javascript
复制
  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()则会对此等待。很明显我错了。

这是可以实现的吗?如果是这样的话,是怎么做的?

任何帮助都是非常感谢的。

EN

回答 1

Stack Overflow用户

发布于 2022-07-29 08:32:08

使用协同服务的标准方法是使用suspendCoroutine()suspendCancellableCoroutine()。它们都挂起等待恢复的执行(例如,从回调),不同的是后者还支持在等待时取消。我建议阅读可取消变体的文档,因为文档在那里要好得多。

使用suspendCoroutine()的示例

代码语言:javascript
复制
suspendCoroutine<Unit> { continuation ->
    functionA(
        { continuation.resume(Unit) },
        { continuation.resumeWithException(it) }
    )
}

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73161522

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档