在 Activity/Fragment 中调用多个挂起函数
Calling multiple suspend functions in Activity/Fragment
在 activity 或片段中调用多个挂起函数时推荐使用哪种方法? (有些函数需要另一个操作的结果)
- 调用一个
lifecycleScope.launch
lambda 中的每个函数
- 每个挂起函数使用多个
lifecycleScope.launch
函数
行为是否改变?
每次调用 CoroutineScope.launch
时,都会创建并启动一个全新的协程,而不会阻塞当前线程,returns 将协程引用为作业。
所以回答你的问题:
- 这些挂起函数将在单个协程中执行。那是什么意思?这意味着它们的执行顺序将是连续的。
lifecycleScope.launch {
invokeSuspend1() // This will be executed first
invokeSuspend2() // Then this will be excuted
}
先执行invokeSuspend1()
,执行完再执行invokeSuspend2()
。
- 为每个挂起函数使用多个
CoroutineScope.launch
函数将创建多个协程,使每个挂起函数彼此独立。所以执行的顺序是不可预测的。
lifecycleScope.launch {
invokeSuspend1()
}
lifecycleScope.launch{
invokeSuspend2()
}
// What is the order of invokeSuspend1 and invokeSuspend2? You'll never know
如果函数需要完成另一个操作的结果,我建议您使用单个协程来保持它们的执行顺序。
这取决于这些函数的作用。如果它们依赖于另一个挂起函数的结果,则在同一个启动作业中启动它们。
如果其中一些可以 运行 异步,将这些函数调用包装在 async 块中。
如果作业应该以特定的生命周期状态开始,您可以使用方便的
lifecycle libs,因此您可以访问 launchWhenCreated
、launchWhenResumed
或 launchWhenStarted
。
在 activity 或片段中调用多个挂起函数时推荐使用哪种方法? (有些函数需要另一个操作的结果)
- 调用一个
lifecycleScope.launch
lambda 中的每个函数
- 每个挂起函数使用多个
lifecycleScope.launch
函数
行为是否改变?
每次调用 CoroutineScope.launch
时,都会创建并启动一个全新的协程,而不会阻塞当前线程,returns 将协程引用为作业。
所以回答你的问题:
- 这些挂起函数将在单个协程中执行。那是什么意思?这意味着它们的执行顺序将是连续的。
lifecycleScope.launch {
invokeSuspend1() // This will be executed first
invokeSuspend2() // Then this will be excuted
}
先执行invokeSuspend1()
,执行完再执行invokeSuspend2()
。
- 为每个挂起函数使用多个
CoroutineScope.launch
函数将创建多个协程,使每个挂起函数彼此独立。所以执行的顺序是不可预测的。
lifecycleScope.launch {
invokeSuspend1()
}
lifecycleScope.launch{
invokeSuspend2()
}
// What is the order of invokeSuspend1 and invokeSuspend2? You'll never know
如果函数需要完成另一个操作的结果,我建议您使用单个协程来保持它们的执行顺序。
这取决于这些函数的作用。如果它们依赖于另一个挂起函数的结果,则在同一个启动作业中启动它们。
如果其中一些可以 运行 异步,将这些函数调用包装在 async 块中。
如果作业应该以特定的生命周期状态开始,您可以使用方便的
lifecycle libs,因此您可以访问 launchWhenCreated
、launchWhenResumed
或 launchWhenStarted
。