Android postDelayed与Coroutines delay的区别

15

我看到这个例子,想知道是否有使用协程的delay而不是Android Handler的postDelayed实现的客观原因?

如果链接失效,下面是示例代码:

val watcher = object :TextWatcher{
    private var searchFor = ""

    override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
        val searchText = s.toString().trim()
        if (searchText == searchFor)
            return

        searchFor = searchText

        launch {       
            delay(300)  //debounce timeOut
            if (searchText != searchFor)
                return@launch

            // do our magic here
        }
    }

    override fun afterTextChanged(s: Editable?) = Unit
    override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) = Unit
}

编辑:澄清一下,协程中的delay可以替换为Android Handler中的postDelayed。不同之处在于,协程将在挂起时执行延迟,而Android Handler将通过将消息存储到线程的消息队列中以便稍后执行延迟。表面上看效果相同,区别在于延迟的执行方式。是否有客观原因说明一个优于另一个?

编辑2:事实证明,在幕后,协程调度程序将使用类似于Android Handler的东西。有关更多详细信息,请参见此处。这意味着引入协程来进行简单延迟是不值得的。

1个回答

2
在某些情况下,使用delay是有客观原因的。如果您需要从延迟之前传递变量或将其放入循环中,则使用delay将使代码更清晰。然而,在这种特定情况下,它并没有多大作用,因为您立即启动了协程后再进行延迟。当然,它也不会有任何缺点,所以如果您认为代码看起来更干净,那么您可能更喜欢这样做。
所有协程的内容都是基于标准框架实现的。在幕后,它始终是Handler和其他可以直接使用的东西。

1
协程是与框架无关的。它们是 Kotlin 的标准库,而不是 Android 的... - IgorGanapolsky
我指的是它们在Android中的实现方式。特别是Dispatchers.Main,它有一个基于Handler和Android特定内容的特殊Android实现。 - niqueco
看一下 Dispatchers.Main 的源代码 - 它是 kotlinx.coroutines 包的一部分。没有 Android 特定的实现。 - IgorGanapolsky
2
不,Android 特定的代码是一个附加模块。请在此处查看:https://github.com/Kotlin/kotlinx.coroutines/tree/master/ui/kotlinx-coroutines-android - niqueco

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接