Middle
Kā scope seko korutīnas atcelšanai?
sobes.tech AI
Atbilde no AI
Scope seko korutīnas atcelšanai, izmantojot Job objektu. Katrs CoroutineScope ir tam saistītais Job.
Kad tiek izveidota jauna korutīna CoroutineScope iekšienē, tā saņem Job no šī scope kā vecāka Job.
Atcelšanas uzraudzības mehānisms darbojas šādi:
- Scope atcelšana: Kad tiek izsaukts
cancel()uzJobscope, tas rekursīvi atceļ visus savus bērnuJob. - Bērnu korutīnu atcelšana: Kad bērna korutīna (piemēram, caur
withContext(NonCancellable)) vai neapstrādāta izņēmuma gadījumā, tā paziņo par to savam vecākaJob. VecākaJob(scope) savukārt var atcelt citus savus bērnuJob. - Kooperatīva atcelšana: Korutinas ir kooperatīvas attiecībā uz atcelšanu. Tas nozīmē, ka korutinas kods regulāri pārbauda, vai tā ir atcelta, lai pareizi pabeigtu savu darbu. Standarta suspendētās funkcijas (piemēram,
delay, I/O operācijas) automātiski pārbaudaJobstāvokli.
Kods var tieši pārbaudīt atcelšanu, izmantojot isActive vai ensureActive():
// Korutinas aktivitātes pārbaudes piemērs
suspend fun fetchData() = coroutineScope {
launch {
while (isActive) {
// Veicam kādu ilgstošu operāciju
delay(100) // suspend punkts - automātiski pārbauda atcelšanu
// Vai tieši pārbaudām
if (!isActive) {
break // izeja no cikla atcelšanas gadījumā
}
}
println("fetchData korutina pabeigta")
}
}
ensureActive() izmantošana izmet CancellationException atcelšanas gadījumā:
// `ensureActive()` izmantošana
suspend fun processData() {
// ... darbi ...
ensureActive() // Izmet `CancellationException`, ja korutina ir atcelta
// ... turpina darbu tikai ja korutina ir aktīva ...
}
CancellationException ir standarta veids, kā izplatīt atcelšanas signālu. To nevajadzētu uzskatīt par kļūdu korutīnu kontekstā.
Scope, kam ir Job, veido hierarhiju "vecāks-auglis" Job, kas ļauj izplatīt atcelšanas signālu no vecāka uz bērniem. Šis ir strukturālā paralelizma pamats korutinās.