动态

详情 返回 返回

Android面試題之Kotlin Jetpack組件LifecycleScope - 动态 详情

本文首發於公眾號“AntDream”,歡迎微信搜索“AntDream”或掃描文章底部二維碼關注,和我一起每天進步一點點

在Kotlin中,LifecycleScope是Android Jetpack架構組件的一部分,主要用於簡化與生命週期相關的協程管理。
它屬於androidx.lifecycle:lifecycle-runtime-ktx庫的一部分,通過結合使用 LifecycleOwner 和協程,簡化了協程與Android生命週期的整合。

什麼是 LifecycleScope?

LifecycleScope 是一個擴展屬性,可以在LifecycleOwner(如ActivityFragment)中使用。

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_STARTON_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:關聯到 ActivityFragment 的生命週期。當 ActivityFragment 被銷燬時,所有在 LifecycleScope 中啓動的協程都會自動取消。
  • launchWhenResumed: 在 Activity 的生命週期至少達到 RESUMED 狀態時協程啓動。當 Activity 被銷燬(例如屏幕旋轉或用户離開),生命週期會先降到 STARTED(如果用户稍後返回該活動),繼而完全銷燬,這時協程會自動取消,不會保留對 Activity 的引用,從而避免內存泄漏。

歡迎關注我的公眾號查看更多精彩文章!

AntDream

user avatar nianqingyouweidenangua 头像 patsy324df_banks901rn 头像 huandanshendeshoushudao 头像 chenjiabing666 头像 fennudemantou 头像 manongtuwei 头像 daixiaoyulq 头像 tuihou123321 头像 segmenhcfucsd 头像 chencaize 头像 winnn 头像 nathannie 头像
点赞 29 用户, 点赞了这篇动态!
点赞

Add a new 评论

Some HTML is okay.