launch — esensya, fire-and-forget na pagsisimula ng mga coroutine at kung paano ito gumagana

May-akda: IT Sectr Nai-publish: 2026-06-22 Oras ng pagbabasa: 7 min

launch — Coroutine Builder sa Kotlin na nagpapasimula ng coroutine nang hindi nagbabalik ng resulta, nagbabalik ng Job object para sa pamamahala ng execution. Ang builder na ito ay nagpapatupad ng fire-and-forget pattern: ang coroutine ay nagsisimula sa background thread at awtomatikong nagtatapos. Ayon sa dokumentasyon ng JetBrains, 2024, ang launch ay ang pangunahing paraan ng pagsisimula ng parallel na mga gawain sa Kotlin Coroutines.

Mga Pangunahing Punto

  • launch — builder para sa pagsisimula ng mga coroutine nang walang resulta (fire-and-forget)
  • Job — object ng pamamahala ng coroutine na may mga pamamaraang cancel(), join(), isActive
  • launch ay sumasama sa CoroutineScope para sa awtomatikong pagkansela ng mga coroutine na anak
  • CoroutineStart.LAZY ay nagbibigay-daan sa pagpapaliban ng pagsisimula hanggang sa tahasang pagtawag ng start() o join()
  • launch sa Android ay ginagamit para sa pag-save sa DB, mga network call, at pag-update ng UI

Ano ang launch sa Kotlin Coroutines?

launch — ay isang extension function ng Kotlin, na available sa pamamagitan ng import kotlinx.coroutines, na gumagawa ng bagong coroutine sa isang tinukoy na CoroutineScope. Hindi tulad ng mga ordinaryong function, ang code sa loob ng launch ay isinasagawa nang sabay-sabay — ang coroutine ay maaaring mag-suspend (suspend) nang hindi hinaharangan ang thread at magpatuloy mamaya.

Ang launch builder ay isang pangunahing bloke ng gusali ng modelo ng coroutine ng Kotlin. Hindi ito nagbabalik ng kinakalkulang halaga, ngunit nagbabalik ng Job object na nagpapahintulot sa pagkontrol ng execution ng coroutine. Lahat ng coroutine na anak na sinimulan sa pamamagitan ng launch sa loob ng isa pang coroutine ay nakatali sa magulang.

Sintaks at parameter ng launch

Ang launch builder ay tinukoy bilang isang inline function na may ilang parameter: CoroutineScope, CoroutineContext, CoroutineStart at suspend-block. Ang mga parameter ay may default na halaga, na ginagawang maginhawa ang launch para sa karaniwang mga sitwasyon.

kotlin
public fun CoroutineScope.launch(
    context: CoroutineContext = EmptyCoroutineContext,
    start: CoroutineStart = CoroutineStart.DEFAULT,
    block: suspend CoroutineScope.() -> Unit
): Job

Ang parameter na context ay tumatanggap ng CoroutineContext na pinagsasama ang dispatcher, exception handler, at pinangalanang elemento. Kadalasang ipinapadala ang Dispatchers.IO, Dispatchers.Main, o SupervisorJob para sa paghihiwalay ng error.

Job at pamamahala ng lifecycle

Job — ang ibinalik na object na kumakatawan sa lifecycle ng coroutine. Ang Job ay maaaring nasa mga estado: New, Active, Completing, Completed, Cancelling, Cancelled. Ang bawat estado ay sumasalamin sa status ng execution at nagpapahintulot ng reaksyon sa mga pagbabago.

kotlin
val job = CoroutineScope(Dispatchers.IO).launch {
    repeat(10) { i ->
        delay(1000L)
        println("Progreso: $i")
    }
}

println("Ang Job ay aktibo: ${job.isActive}")
delay(2500L)
job.cancel()
println("Ang Job ay nakansela: ${job.isCancelled}")

Sinusuportahan ng Job ang hierarchy: kung ang magulang na coroutine ay nakansela, lahat ng coroutine na anak ay awtomatikong makakansela. Binabago ng SupervisorJob ang pag-uugaling ito — ang mga coroutine na anak ay hindi makakansela sa error ng isa sa kanila.

Naka-estrukturang concurrency sa launch

Ang naka-estrukturang concurrency ay nangangahulugan na ang bawat coroutine ay sinisimulan sa isang tiyak na CoroutineScope, at ang scope ay hindi magtatapos hanggang ang lahat ng coroutine na anak ay matapos ang kanilang gawain. Ganap na sinusuportahan ng launch ang prinsipyong ito — ang mga coroutine na sinimulan sa loob ng isa pang coroutine ay mga anak nito.

Mga nested na tawag sa launch

Sa nested na pagsisimula ng launch, nabubuo ang isang puno ng mga coroutine. Ang magulang na coroutine ay naghihintay ng pagkumpleto ng lahat ng anak, na nag-gagarantiya ng predictable na pagkakasunod-sunod ng execution at nagpapasimple sa pamamahala ng resources.

kotlin
fun main() = runBlocking {
    launch {
        launch {
            delay(1000L)
            println("Anak 1 natapos")
        }
        launch {
            delay(500L)
            println("Anak 2 natapos")
        }
        println("Lahat ng anak natapos bago ang linyang ito")
    }
}

Ang pag-uugaling ito ay naiiba sa concurrency na batay sa thread, kung saan ang mga thread na anak ay hindi nakatali sa magulang. Sa mga coroutine, ang magulang ay hindi nagtatapos hanggang ang lahat ng anak ay matapos ang kanilang gawain.

Pamamahala ng exception sa launch

Ang pamamahala ng exception sa launch ay nakadepende sa uri ng Job. Para sa ordinaryong Job, ang exception ay kumakalat sa magulang na coroutine at kinakansela ito. Para sa SupervisorJob o SupervisorScope, ang exception ay isolated — ang error ng isang coroutine na anak ay hindi nakakaapekto sa iba.

kotlin
val scope = CoroutineScope(SupervisorJob() + Dispatchers.IO)
scope.launch {
    try {
        riskyOperation()
    } catch (e: Exception) {
        println("Nahuli: ${e.message}")
    }
}
scope.launch {
    println("Ito ay tumatakbo pa rin salamat sa SupervisorJob")
}

Para sa global na pamamahala ng hindi nahuhuling exception, ginagamit ang CoroutineExceptionHandler. Hinuhuli nito ang mga exception na hindi napamahalaan sa loob ng coroutine at nagpapahintulot sa pag-log ng error nang walang crash ng application.

Mga halimbawa ng paggamit ng launch sa Android

Sa Android, ang launch ay ginagamit kahit saan: mula ViewModel hanggang WorkManager. Ang pangunahing pattern ay ang paggamit ng lifecycleScope sa Fragment at viewModelScope sa ViewModel para sa awtomatikong pagkansela ng mga coroutine sa pagtatapos ng lifecycle ng component.

kotlin
class ProfileViewModel : ViewModel() {
    private val repository = UserRepository()

    fun loadProfile(userId: String) {
        viewModelScope.launch(Dispatchers.IO) {
            val profile = repository.fetchProfile(userId)
            withContext(Dispatchers.Main) {
                _profileState.update { it.copy(profile = profile) }
            }
        }
    }
}

Ang viewModelScope ay awtomatikong kinakansela ang mga coroutine kapag ang ViewModel ay nawasak. Tinatanggal nito ang mga leak ng memorya at ginagarantiya na ang mga background operation ay hindi magpapatuloy pagkatapos mawala ang konteksto. Dagdag pa, maaaring gamitin ang withContext para sa paglipat sa pagitan ng mga dispatcher.

Mga Madalas Itanong

Ano ang pagkakaiba ng launch at async sa Kotlin Coroutines?

launch ay nagbabalik ng Job at hindi nagbabalik ng resulta ng execution, samantalang ang async ay nagbabalik ng Deferred<T> para sa pagkuha ng resulta. Ang launch ay ginagamit para sa fire-and-forget na operasyon, async — kapag kailangan mong maghintay at gamitin ang ibinalik na halaga.

Paano kanselahin ang coroutine na sinimulan sa pamamagitan ng launch?

Tawagan ang job.cancel() sa naka-save na Job object. Para sa group cancellation, kanselahin ang buong CoroutineScope sa pamamagitan ng scope.cancel(). Ang coroutine ay dapat maging cooperative — suriin ang isActive o gumamit ng mga nabe-verify na suspend function.

Ano ang gagawin kung ang launch ay nag-throw ng exception?

Gumamit ng try-catch sa loob ng launch block o ipasa ang CoroutineExceptionHandler sa CoroutineContext. Para sa paghihiwalay ng error, gumamit ng SupervisorJob — kung gayon ang exception sa isang coroutine na anak ay hindi makakansela sa iba.

Maaari bang simulan ang launch nang walang CoroutineScope?

Hindi, ang launch ay isang extension function ng CoroutineScope. Kung walang scope, ang coroutine ay hindi makakasunod sa prinsipyo ng naka-estrukturang concurrency. Gamitin ang GlobalScope.launch nang may pag-iingat — ito ay lumilikha ng coroutine na walang pagkakatali sa lifecycle.

Ilang launch coroutine ang maaaring sabay na simulan?

Ang bilang ay limitado ng thread pool ng dispatcher. Dispatchers.Default ay gumagamit ng bilang ng thread na katumbas ng bilang ng CPU cores. Dispatchers.IO ay sumusuporta ng hanggang 64 thread. Kapag nagsisimula ng mas maraming coroutine, sila ay inilalagay sa pila.

Buod

  • launch — pangunahing builder para sa fire-and-forget coroutine, nagbabalik ng Job object
  • Job ay nagbibigay ng mga pamamaraan ng pamamahala: cancel(), join(), isActive, isCancelled, isCompleted
  • Naka-estrukturang concurrency ay nag-gagarantiya ng pagkansela ng mga coroutine na anak sa pagkansela ng magulang
  • Pamamahala ng exception ay nakadepende sa uri ng Job: ordinaryong nagpapakalat ng error, SupervisorJob ay naghihiwalay
  • lifecycleScope at viewModelScope — handa nang solusyon para sa launch sa Android
  • CoroutineStart.LAZY ay nagpapaliban ng pagsisimula hanggang sa tahasang pagtawag ng start() o join()
  • Ang launch sa Android ay ginagamit para sa network request, pagsulat sa DB, analytics, at caching

Gagawa kami ng mobile application na turnkey

Gumagawa ang IT Sectr ng mga iOS at Android application para sa mga startup at negosyo mula noong 2017. Magpapayo kami sa iyo at magmumungkahi ng pinakamahusay na solusyon.

Pag-usapan ang proyekto

Basahin din