【问题标题】:Kotlin runBlocking on background thread后台线程上的 Kotlin runBlocking
【发布时间】:2019-01-29 14:54:48
【问题描述】:

我正在将现有应用从 Java 转换为 Kotlin。 该应用程序创建了一个 IntentService,它在后台线程中运行,并负责执行一些操作,这些操作会使用suspend 函数重复且无限期地阻塞线程(例如网络调用、数据库交互)。 由于“当前线程”实际上是一个后台线程,我并没有阻塞 UI。

在当前线程上使用runBlocking 来运行所有挂起函数是一个好习惯吗?还是有更好的方法?

【问题讨论】:

  • 服务的后台线程用于传递来自系统的通知。因此,如果您将其用于可能长时间的操作 - 您将无法从系统接收新事件。对于这种情况,您不需要任何 suspend 函数来使用。另一种方法是将执行卸载到专用线程池,而不是为文本通知释放后台线程。在这里你可能更喜欢launchasync 函数
  • 我使用后台线程将数据发送到 Web 服务并每 x 秒更新一次应用程序数据库,并且该线程需要在后台运行数小时(为此我使用了 IntentService)。我将编辑我的问题以便更清楚
  • 如果你打算阻塞线程,使用协程有什么意义?
  • @MarkoTopolnik 因为我需要使用一些已经定义的 Kotlin 函数,它们是挂起函数

标签: android multithreading kotlin kotlinx.coroutines


【解决方案1】:

这正是runBlocking 的用法。 runBlocking 被添加到协程中,以在 coroutines 的用户和其他阻塞执行代码的地方之间架起一座桥梁。如果您希望线程被阻塞并等待协程的执行,您应该始终使用runBlocking

【讨论】:

    猜你喜欢
    • 2019-02-19
    • 1970-01-01
    • 1970-01-01
    • 2019-07-17
    • 2017-11-26
    • 2011-02-14
    • 1970-01-01
    • 1970-01-01
    • 2020-10-08
    相关资源
    最近更新 更多