gpt4 book ai didi

android - 使用 viewLifecycleOwner 的生命周期范围从 Fragment 启动协程

转载 作者:行者123 更新时间:2023-12-04 23:58:51 29 4
gpt4 key购买 nike

我正在从 Fragment 启动协程,我的理解是

lifecycleScope.launch {}
viewLifecycleOwner.lifecycleScope.launch {}
在大多数情况下基本上是一样的。
从 fragment 内部启动协程时,使用一个比另一个有好处吗?

最佳答案

viewLifecycleOwner.lifecycleScope 只会在 fragment 的 View 处于有效状态时执行。如果您离开 fragment ,仍在该范围内执行的协程将被取消。而协程在 中启动生命周期范围 将完成。
你可以试试下面的代码自己看看。假设这是从 onViewCreated 中的 fragment #1 启动的,它会在 < 5 秒内自动移动到 fragment #2。

val handler = CoroutineExceptionHandler {_, exception ->
println("got $exception")
}
this.lifecycleScope.launch (handler) {
try {
println("LSCOPE: LifecycleOwner.lifecycleScope started")
delay(5000)
println("LSCOPE: LifecycleOwner.lifecycleScope completed")
}
catch(e: CancellationException){
println("LSCOPE: lifecycleScope cancelled: $e")
}
}

this.viewLifecycleOwner.lifecycleScope.launch (handler) {
try {
println("LSCOPE: viewLifecycleOwner.lifecycleScope started")
delay(5000)
println("LSCOPE: viewLifecycleOwner.lifecycleScope completed")
}
catch(e: CancellationException){
println("LSCOPE: viewLifecycleOwner.lifecycleScope cancelled: $e")
}
}
当 lifeCyclescope 成功完成时,viewLifecycleOwner.lifecycleScope 中启动的协程将被取消;

I/System.out: LSCOPE: viewLifecycleOwner.lifecycleScope cancelled:kotlinx.coroutines.JobCancellationException: Job was cancelled;job=SupervisorJobImpl{Cancelling}@ed6f718


与:

I/System.out: LSCOPE: LifecycleOwner.lifecycleScope completed


那么,有什么好处呢?在旁观者的眼中 - 取决于您的用例:)

关于android - 使用 viewLifecycleOwner 的生命周期范围从 Fragment 启动协程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69890754/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com