Sobes.tech
Middle+

Koji neočekivani problemi mogu nastati prilikom rada sa korutinama u Androidu?

sobes.tech АИ

Одговор од АИ

  • Neočekivano otkazivanje: Korutina može biti implicitno otkazana, na primer, prilikom promene konfiguracije uređaja ili zatvaranja Activity/Fragment, ako se kontekst životnog ciklusa ne upravlja pažljivo. To može dovesti do curenja memorije ili nedovršenih operacija.
  • Problemi sa kontekstom (propagacija konteksta): Prenos konteksta korutine između slojeva aplikacije (UI, ViewModel, Repository) zahteva pažnju. Pogrešna upotreba konteksta može izazvati zamrzavanje UI ili blokiranje niti.
  • Curanje resursa zbog neobrađenih izuzetaka: Neobrađeni izuzeci u decom korutinama mogu implicitno otkazati roditelja, ali resursi alocirani unutar deteta možda neće biti oslobođeni.
  • "Hladni" tokovi (Flow) i upravljanje životnim ciklusom: Flow je po prirodi lenj i zahteva aktivno prikupljanje podataka. Ako prikupljanje nije pravilno upravljano (npr. pomoću flowWithLifecycle ili collectLatest), može doći do neželjenog ponašanja pri promenama stanja UI ili životnog ciklusa.
  • Blokirajući pozivi: Uključivanje blokirajućih poziva (kao što su mrežne ili fajl operacije) u korutinu koja se izvršava na glavnom dispečeru (Dispatchers.Main) dovodi do ANR.
// Primer potencijalnog problema sa otkazivanjem korutine pri promeni konfiguracije
class MyViewModel : ViewModel() {
    fun loadData() {
        viewModelScope.launch {
            // Duga operacija
            delay(5000)
            // Ako se Activity ponovo kreira tokom delay, ova linija možda neće biti izvršena
            println("Podaci su učitani")
        }
    }
}

// Primer blokirajućeg poziva na Main dispečeru
import kotlinx.coroutines.*

fun performBlockingOperation() {
    runBlocking { // Nemojte koristiti u UI niti!
        delay(1000) // Blokira nit
    }
}

// Trebalo bi da bude ovako:
fun performNonBlockingOperation() {
    CoroutineScope(Dispatchers.Default).launch {
        delay(1000) // Ne blokira glavni nit
    }
}