Middle+
Aké neočakávané problémy môžu nastať pri práci s korutínami v Androide?
sobes.tech AI
Odpoveď od AI
- Neočakávané zrušenie: Korutina môže byť implicitne zrušená, napríklad pri zmene konfigurácie zariadenia alebo zatvorení Activity/Fragment, ak sa kontext životného cyklu neriadene starostlivo. To môže viesť k únikom pamäte alebo nedokončeným operáciám.
- Problémy s kontextom (propagácia kontextu): Prenos kontextu korutiny medzi vrstvami aplikácie (UI, ViewModel, Repository) si vyžaduje pozornosť. Nesprávne použitie kontextu môže spôsobiť zamrznutie UI alebo blokovanie vlákien.
- Úniky zdrojov kvôli neovládaným výnimkám: Neovládané výnimky v deťoch korutín môžu implicitne zrušiť rodiča, ale zdroje pridelené vo vnútri dieťaťa nemusia byť uvoľnené.
- "Chladné" prúdy (
Flow) a správa životného cyklu:Flowje od prirodzenosti lenivý a vyžaduje aktívne zbieranie dát. Ak zbieranie nie je správne riadené (napríklad pomocouflowWithLifecyclealebocollectLatest), môže dôjsť k neželanému správaniu pri zmenách stavu UI alebo životného cyklu. - Blokujúce volania: Zahrnutie blokujúcich volaní (napríklad sieťových alebo súborových operácií) do korutiny, ktorá beží na hlavnom dispečeri (
Dispatchers.Main), povedie k ANR.
// Príklad potenciálneho problému s zrušením korutiny pri zmene konfigurácie
class MyViewModel : ViewModel() {
fun loadData() {
viewModelScope.launch {
// Dlhá operácia
delay(5000)
// Ak sa Activity počas delay znovu vytvorí, tento riadok nemusí byť vykonaný
println("Dáta načítané")
}
}
}
// Príklad blokujúceho volania na hlavnom dispečeri
import kotlinx.coroutines.*
fun performBlockingOperation() {
runBlocking { // Nepoužívajte v UI vlákne!
delay(1000) // Blokuje vlákno
}
}
// Malo by to byť takto:
fun performNonBlockingOperation() {
CoroutineScope(Dispatchers.Default).launch {
delay(1000) // Neblokuje hlavné vlákno
}
}