【问题标题】:Calling multiple suspend functions in Activity/Fragment在 Activity/Fragment 中调用多个挂起函数
【发布时间】:2020-11-18 10:52:52
【问题描述】:
在 Activity 或 Fragment 中调用多个挂起函数时推荐哪种方法? (有些函数需要另一个运算的结果)
- 在一个
lifecycleScope.launch lambda 中调用每个函数
- 为每个挂起函数使用多个
lifecycleScope.launch 函数
行为会改变吗?
【问题讨论】:
标签:
android
kotlin
kotlin-coroutines
android-architecture-components
【解决方案1】:
每次调用CoroutineScope.launch,都会创建并启动一个全新的协程,而不会阻塞当前线程,并将对协程的引用作为作业返回。
所以回答你的问题:
- 这些挂起函数将在单个协程中执行。这意味着什么?这意味着它们的执行顺序将是连续的。
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
如果函数需要执行另一个操作的结果,我建议您使用单个协程来保持它们的执行顺序。
【解决方案2】:
这取决于这些函数试图做什么。如果它们依赖于另一个挂起函数的结果,请在同一个启动作业中启动它们。
如果其中一些可以异步运行,请将这些函数调用包装在 async 块中。
如果作业应该以特定的生命周期状态开始,您可以使用方便的
lifecycle libs,因此您可以访问launchWhenCreated、launchWhenResumed 或launchWhenStarted。