【问题标题】:Calling multiple suspend functions in Activity/Fragment在 Activity/Fragment 中调用多个挂起函数
【发布时间】:2020-11-18 10:52:52
【问题描述】:

在 Activity 或 Fragment 中调用多个挂起函数时推荐哪种方法? (有些函数需要另一个运算的结果)

  1. 在一个 lifecycleScope.launch lambda 中调用每个函数
  2. 为每个挂起函数使用多个 lifecycleScope.launch 函数

行为会改变吗?

【问题讨论】:

    标签: android kotlin kotlin-coroutines android-architecture-components


    【解决方案1】:

    每次调用CoroutineScope.launch,都会创建并启动一个全新的协程,而不会阻塞当前线程,并将对协程的引用作为作业返回。

    所以回答你的问题:

    1. 这些挂起函数将在单个协程中执行。这意味着什么?这意味着它们的执行顺序将是连续的。
    lifecycleScope.launch {
        invokeSuspend1() // This will be executed first
        invokeSuspend2() // Then this will be excuted
    }
    

    首先执行invokeSuspend1(),完成后执行invokeSuspend2()

    1. 为每个挂起函数使用多个CoroutineScope.launch 函数将创建多个协程,使每个挂起函数彼此独立。所以执行的顺序是不可预测的。
    lifecycleScope.launch {
        invokeSuspend1()
    }
    
    lifecycleScope.launch{
        invokeSuspend2()
    }
    
    // What is the order of invokeSuspend1 and invokeSuspend2? You'll never know
    

    如果函数需要执行另一个操作的结果,我建议您使用单个协程来保持它们的执行顺序。

    【讨论】:

      【解决方案2】:

      这取决于这些函数试图做什么。如果它们依赖于另一个挂起函数的结果,请在同一个启动作业中启动它们。

      如果其中一些可以异步运行,请将这些函数调用包装在 async 块中。

      如果作业应该以特定的生命周期状态开始,您可以使用方便的 lifecycle libs,因此您可以访问launchWhenCreatedlaunchWhenResumedlaunchWhenStarted

      【讨论】:

        猜你喜欢
        • 2021-11-24
        • 1970-01-01
        • 1970-01-01
        • 2017-05-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-11-07
        • 1970-01-01
        相关资源
        最近更新 更多