在Kotlin中,LifecycleScope
是Android Jetpack架构组件的一部分,主要用于简化与生命周期相关的协程管理。
它属于androidx.lifecycle:lifecycle-runtime-ktx
库的一部分,通过结合使用 LifecycleOwner
和协程,简化了协程与Android生命周期的整合。
什么是 LifecycleScope?
LifecycleScope
是一个扩展属性,可以在LifecycleOwner
(如Activity
或Fragment
)中使用。
public val LifecycleOwner.lifecycleScope: LifecycleCoroutineScope
get() = lifecycle.coroutineScope
在这个范围内启动的协程都会在对应的生命周期被取消,避免内存泄漏和无效操作。例如,当一个 Activity
被销毁时,在 LifecycleScope
内启动的协程会自动取消。
lifecycleScope.launch {
// 在 Activity 或 Fragment 的 lifecycleScope 中启动的协程
}
launchWhenCreated/Resumed等 API 的区别
这些 API 用于在特定的生命周期状态下启动协程,并且在适当的时候暂停和恢复它们。
1. launchWhenCreated
- 当
Lifecycle
处于CREATED
状态及更高状态时启动协程。 - 如果在
CREATED
状态之前调用,则会挂起,直到生命周期达到CREATED
状态。 - 在其他状态下(如
ON_START
或ON_RESUME
)调用时,协程立即开始执行。 - 取消条件:如果生命周期从
CREATED
状态降到DESTROYED
,协程会被取消。例如,在 Activity 或 Fragment 被销毁时,协程会被取消。
lifecycleScope.launchWhenCreated {
// 代码将在生命周期至少处于 CREATED 状态时执行
}
2. launchWhenStarted
- 当
Lifecycle
处于STARTED
状态及更高状态时启动协程。 - 如果在
STARTED
状态之前调用,则会挂起,直到生命周期达到STARTED
状态。 - 在其他状态下(如
ON_RESUME
)调用时,协程立即开始执行。 - 如果生命周期从
STARTED
状态降到CREATED
,协程会被暂停。 - 如果生命周期从
CREATED
状态降到DESTROYED
,协程会被取消。例如,在 Activity 或 Fragment 被销毁时,协程会被取消。
lifecycleScope.launchWhenStarted {
// 代码将在生命周期至少处于 STARTED 状态时执行
}
3. launchWhenResumed
- 当
Lifecycle
处于RESUMED
状态时启动协程。 - 如果在
RESUMED
状态之前调用,则会挂起,直到生命周期达到RESUMED
状态。 - 在
RESUMED
状态下调用时,协程立即开始执行。 - 如果生命周期从
RESUMED
状态降到STARTED
,协程会被暂停。 - 如果生命周期从
CREATED
状态降到DESTROYED
,协程会被取消。例如,在 Activity 或 Fragment 被销毁时,协程会被取消。
lifecycleScope.launchWhenResumed {
// 代码将在生命周期处于 RESUMED 状态时执行
}
简单总结
launchWhenCreated
:确保协程在生命周期至少为CREATED
时执行,只有在生命周期降到DESTROYED
时才会被取消。launchWhenStarted
:确保协程在生命周期至少为STARTED
才会执行,当降到CREATED
时暂停,降到DESTROYED
时取消。launchWhenResumed
:确保协程仅在生命周期为RESUMED
时执行,当降到STARTED
时暂停,降到DESTROYED
时取消。
使用 LifecycleScope 避免内存泄漏
使用 LifecycleScope
和相关的launchWhenCreated/Resumed
等API,可以确保协程在组件生命周期的适当时机被启动和取消,从而有效避免内存泄漏。
class ExampleActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_example)
// 使用 LifecycleScope 启动协程
lifecycleScope.launchWhenResumed {
// 假设这个任务需要长时间运行
delay(10000)
// 更新 UI 或执行一些与 Activity 相关的操作
findViewById<TextView>(R.id.textView).text = "任务完成"
}
}
}
LifecycleScope
:关联到Activity
或Fragment
的生命周期。当Activity
或Fragment
被销毁时,所有在LifecycleScope
中启动的协程都会自动取消。launchWhenResumed
: 在Activity
的生命周期至少达到RESUMED
状态时协程启动。当Activity
被销毁(例如屏幕旋转或用户离开),生命周期会先降到STARTED
(如果用户稍后返回该活动),继而完全销毁,这时协程会自动取消,不会保留对Activity
的引用,从而避免内存泄漏。
END
点亮【赞和在看】,让钱和爱都流向你。
心里种花,人生才不会荒芜,如果你也想一起成长,请点个关注吧。
作者介绍
中年程序猿,十年移动端开发老司机,分享一线开发经验和知识,正在探索通过副业渡过中年危机
越努力越幸运,加油