【问题标题】:HandlerThread replacement in Coroutines协程中的 HandlerThread 替换
【发布时间】:2018-09-24 14:41:15
【问题描述】:

我有一些代码使用单个 HandlerThread 和 Handler 向它发送消息。有没有办法用协程做到这一点?我不想每次都创建新的协程,我只想在 HandlerThread 上执行代码块。请帮忙

【问题讨论】:

    标签: android kotlin kotlinx.coroutines


    【解决方案1】:

    如果您希望在 Android 主线程中执行代码块,则可以使用来自 kotlinx-coroutines-android 模块的 UI 上下文,如下所示:

    launch(UI) { 
        ... // this block of code will be executed in main thread
    }
    

    上面的 sn-p 向主处理程序发送一条消息以执行您的代码。

    如果您正在寻找用于后台工作的自定义处理程序线程,那么您可以通过以下两种方式之一创建单线程上下文。

    通用方法:像这样使用newSingleThreadedContext()

    val ctx = newSingleThreadedContext() // define your context
    
    launch(ctx) { ... } // use it to submit your code there
    

    Android专用方法:新建AndroidHandler,使用Handler.asCoroutineDispatcher()扩展将其转换为协程上下文扩展。然后您就可以使用launch 发送您的代码块以供执行。

    【讨论】:

    • 是的,我知道这是可能的,但如果我每次想在该线程上运行代码时都创建一个新的协程(并且可运行),它不会导致开销吗?现在我正在使用带有处理程序的 HandlerThread 向 Handler 发送消息,后者又在 HandlerThread 上处理这些消息。是否可以创建一个新的协程,例如每 2 秒?
    • 可以每 2 秒创建一个新的协程。协程非常非常轻量级。
    • 谢谢,我只是不确定它是否会导致开销,因为作为调度程序在处理程序上启动的每个代码块也会创建一个新的 Runnable。我接受了你的回答。
    猜你喜欢
    • 2021-09-25
    • 1970-01-01
    • 2019-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-09
    • 2011-07-16
    • 1970-01-01
    相关资源
    最近更新 更多