Kotlin 在这种情况下,您不需要';我不想要或者你不应该';在科特林不使用协同程序?

Kotlin 在这种情况下,您不需要';我不想要或者你不应该';在科特林不使用协同程序?,kotlin,kotlin-coroutines,coroutine,Kotlin,Kotlin Coroutines,Coroutine,我读过很多关于使用协同程序的冒险故事,但我并没有发现为什么你们不应该或者不能使用它们 顺便问一下,为什么不将所有方法都用作挂起方法呢 我在理解这里的一些概念时遇到了一些困难,因此,对于我的问题,我假装提出了相反的情况(为什么不使用它),这样相比之下,我可以更好地理解。不让所有函数都可挂起的主要原因是它们引入的开销,至少在JVM上是如此。每个可挂起的函数都编译成一个Java方法,该方法接收另一个参数continuation对象,其主体编译成相当复杂的状态机代码,除其他外,该代码总是实例化另一个co

我读过很多关于使用协同程序的冒险故事,但我并没有发现为什么你们不应该或者不能使用它们

顺便问一下,为什么不将所有方法都用作挂起方法呢


我在理解这里的一些概念时遇到了一些困难,因此,对于我的问题,我假装提出了相反的情况(为什么不使用它),这样相比之下,我可以更好地理解。

不让所有函数都可挂起的主要原因是它们引入的开销,至少在JVM上是如此。每个可挂起的函数都编译成一个Java方法,该方法接收另一个参数continuation对象,其主体编译成相当复杂的状态机代码,除其他外,该代码总是实例化另一个continuation对象,并将其菊花链连接到作为参数接收的对象


因此,无论何时,如果您无法从协同程序中获得任何好处,您都不应该将其作为默认的做事方式。

请查看我对您的问题的回答:

  • 但我找不到你为什么不应该或不能使用它们的原因。
    回答: A.您不应将其用于任何前台任务。
    B您不应将其用于任何简单/真正快速的操作。
    C您不应该将它们用于任何类型的初始化

  • 顺便问一下,为什么不将所有方法都用作挂起方法呢?
    回答
    a) 这将被视为代码气味。这样做的错误做法。
    b) 如果将所有函数标记为suspend,则无论何时调用suspend函数,都必须创建一个协同路由作用域来运行它。
    c) 暂停功能的测试是困难的。它需要从AndroidX额外设置
    RunBlockingTest


  • 您不应该将它们用于同步工作或传输数据流(在这些情况下使用)。您可以将它们用于异步工作,我会发现,实际上“c.您不应该将它们用于任何类型的初始化”并不总是正确的,因为我会在ViewModel的init方法中看到一些带有协程初始化的代码示例,以便在UI加载时加载一些数据。