本文首發於公眾號“AntDream”,歡迎微信搜索“AntDream”或掃描文章底部二維碼關注,和我一起每天進步一點點
在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和launchWhenResumed 等 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、launchWhenResumed 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的引用,從而避免內存泄漏。
歡迎關注我的公眾號查看更多精彩文章!