lifecycleScope.launchWhen系列API已废弃,单次执行的替代方案是什么?
替代已废弃的launchWhenStarted/whenStarted实现单次异步任务
已废弃的写法
- 原
launchWhenStartedAPI已废弃:
lifecycleOwner.lifecycleScope.launchWhenStarted { // Do something async }
- 结合
launch和whenStarted的写法同样已废弃:
lifecycleOwner.lifecycleScope.launch { lifecycleOwner.whenStarted { // Do something async } }
更优雅的单次执行替代方案
如果需要仅在生命周期进入STARTED状态时执行一次异步任务,可以使用awaitStateAtLeast实现,无需嵌套协程:
lifecycleOwner.lifecycleScope.launch { // 挂起协程,直到生命周期状态至少为STARTED lifecycleOwner.lifecycle.awaitStateAtLeast(Lifecycle.State.STARTED) // 执行单次异步操作 // Do something async }
这个方案的优势:
- 无需嵌套协程,代码结构简洁
- 仅在生命周期首次达到
STARTED状态时执行一次任务,符合需求 - 自动遵循生命周期规则,当生命周期销毁时,协程会自动取消
关于你的现有写法
你之前的嵌套写法虽然能实现功能,但存在不必要的协程嵌套,且withStarted的block不支持挂起函数,导致需要额外启动协程,上述方案可以避免这些问题。
内容的提问来源于stack exchange,提问作者user924
相关产品推荐
相关产品推荐

