Zpět na domů

Strukturovaná souběžnost v Kotlinu pro Android

Článek rozebírá Structured Concurrency v Kotlinu na příkladu auditu GeminiAI expertem JetBrains. Jsou popsána pravidla dědičnosti kontextu, čekání na dokončení a zrušení úkolů. Použití ve ViewModel a Repository pro Android bez úniků paměti.

Jak Kotlin Expert zkontroloval GeminiAI: Structured Concurrency
Advertisement 728x90

Structured Concurrency v Kotlinu: lekce z auditu GeminiAI od experta JetBrains

Vývojář Šamil Gilmetov podrobil svůj projekt GeminiAI — klienta Gemini pro Android — detailnímu auditu Marcinem Moskalou, certifikovaným trenérem JetBrains a autorem knih o Kotlinu. Projekt využívá Navigation3, Jetpack Compose, Coroutines a Flow pro implementaci streamování odpovědí od Gemini s řízením kontextu a automatickým čištěním zdrojů. Audit odhalil silné stránky v aplikaci Structured Concurrency, čímž se kód stal vzorovým příkladem pro studium asynchronního programování v Androidu.

Marcin ocenil pevnou strukturu a pokrytí okrajových případů, přidal se do contributors repozitáře. Certifikát Kotlin Expert Workshop potvrdil kvalitu.

Evoluce asynchronního programování: od GOTO ke struktuře

Článek ve spoluautorství Gilmetova a Moskaly kreslí paralelu mezi špagetovým kódem 50.–60. let (FLOW-MATIC s logickými skoky) a nestrukturovanými korutinami. Spouštění úloh bez scope vede k únikům: dceřiné korutiny pokračují v práci po zrušení rodiče, čímž spotřebovávají zdroje.

Google AdInline article slot

Edsger Dijkstra v roce 1968 v 'Go To Statement Considered Harmful' zdůvodnil odmítnutí GOTO pro předvídatelnost. Podobně Structured Concurrency zavádí jasné hranice pro paralelismus.

Zlatá pravidla Structured Concurrency

V Kotlinu tři klíčové mechanismy zajišťují kontrolu nad korutinami:

  • Dědičnost kontextu: Dceřiné korutiny získávají dispatcher a další parametry rodiče.
  • Čekání na dokončení: Scope se blokuje do ukončení všech launch/async uvnitř.
  • Automatické zrušení: Zrušení nebo chyba rodiče zruší celý strom úloh.

Příklad základní konstrukce:

Google AdInline article slot
coroutineScope {
    launch { /* Úloha 1 */ }
    launch { /* Úloha 2 */ }
}
// Pokračování až po dokončení úloh

Aplikace v Androidu: ViewModel a Repository

V GeminiAI ChatRepository zapouzdřuje API požadavky na Gemini a ViewModel spravuje zrušení přes viewModelScope. Při zničení ViewModel se všechny síťové volání a streamování automaticky přeruší, čímž se minimalizují úniky paměti.

  • viewModelScope: Strukturovaný lifecycle-aware scope pro ViewModel.
  • Flow v repository: Reaktivní toky pro stavy bez init{} bloků.
  • Dagger-Hilt + Room: Škálovatelná DI a perzistence.

To pokrývá okrajové případy streamování: zrušení požadavku okamžitě vyčistí kontext.

Výhody v produkci

Structured Concurrency zjednodušuje ladění, testování a údržbu. Neexistují 'zapomenuté' úlohy, lifecycle je předvídatelný. Ve srovnání se zastaralými přístupy (GlobalScope):

Google AdInline article slot

| Přístup | Úniky paměti | Zrušení úloh | Lifecycle |

|--------|---------------|--------------|-----------|

| GlobalScope | Vysoké riziko | Ruční | Ne |

| coroutineScope | Ne | Automatické | Strukturovaný |

| viewModelScope | Ne | Automatické | Lifecycle-aware |

Projekt GeminiAI demonstruje integraci s Jetpack Compose: navigace a UI se aktualizují podle Flow bez blokování UI.

Co je důležité

  • Structured Concurrency eliminuje úniky úloh, podobně jako odmítnutí GOTO.
  • viewModelScope — standard pro Android ViewModel s automatickým zrušením.
  • Dědičnost kontextu a čekání na dokončení zajišťují předvídatelnost.
  • Aplikace v GeminiAI: streamování Gemini s čištěním zdrojů.
  • Audit Moskaly potvrdil kód jako příklad pro senior-vývojáře.

— Editorial Team

Advertisement 728x90

Číst dál