簡體   English   中英

CoroutineScope 的 scope 是什么?

[英]What's the scope of a CoroutineScope?

我目前正在學習協程。 在我的Application class 的onCreate中,我執行了以下操作:

override fun onCreate() {
    super.onCreate()

    val job = CoroutineScope(IO).launch {
        while(true) {
            Timber.i("hello from coroutine")
            delay(1000)
        }
    }

    job.invokeOnCompletion {
        Timber.i("job.invokeOnCompletion")
    }
}

我本來希望在onCreate完成后取消作業,但它會無休止地運行:

2020-06-28 16:23:11.436 onCreate$job: hello from coroutine
[..]
2020-06-28 16:23:19.489 onCreate$job: hello from coroutine
2020-06-28 16:23:21.504 onCreate$job: hello from coroutine
2020-06-28 16:23:22.512 onCreate$job: hello from coroutine
2020-06-28 16:23:23.516 onCreate$job: hello from coroutine
[..]
2020-06-28 16:23:45.671 onCreate$job: hello from coroutine
  1. 那么 CoroutineScope 的CoroutineScope是什么? 不應該在onCreate結束后立即取消嗎?
  2. 請注意作業 output,在16:23: 19 .48916:23: 21 .504之間存在間隙,缺少16:23: 20 誰能解釋為什么?
  3. 我多次強制垃圾收集,output 仍在繼續。 會期望這項job會被垃圾收集,因為它是一個局部變量嗎?

如果線程仍在運行,則不能對其進行垃圾收集。

協程仍在運行,並且不會在 onCreate() 結束時被取消。 如果您想在片段被銷毀時自動取消,您可以將協程附加到片段或活動的生命周期。 但是,onCreate() 和函數通常沒有生命周期。 如果你想達到類似的效果,你必須在 function 的末尾job.cancel()

所以回答你的問題:

  1. 不,線程(或協程)不會被任意取消。
  2. CPU 忙於運行其他任務 1 秒。 例如,IO 線程的優先級與 UI 不同。
  3. 不能強制GC,只能建議現在是收集垃圾的好時機。 你不應該試圖智取 GC。 而且,也沒有什么可以收集的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM