Sobes.tech
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: Flow je od prirodzenosti lenivý a vyžaduje aktívne zbieranie dát. Ak zbieranie nie je správne riadené (napríklad pomocou flowWithLifecycle alebo collectLatest), 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
    }
}