Sobes.tech
Middle+

Jaké neočekávané problémy mohou nastat při práci s korutinami v Androidu?

sobes.tech AI

Odpověď od AI

  • Nepředvídané zrušení: Korutina může být implicitně zrušena, například při změně konfigurace zařízení nebo zavření Activity/Fragment, pokud není pečlivě spravován kontext životního cyklu. To může vést k únikům paměti nebo nedokončeným operacím.
  • Problémy s kontextem (propagace kontextu): Přenos kontextu korutiny mezi vrstvami aplikace (UI, ViewModel, Repository) vyžaduje pozornost. Nesprávné použití kontextu může způsobit zamrznutí UI nebo blokování vláken.
  • Úniky zdrojů kvůli neřízeným výjimkám: Neřízené výjimky v dětských korutinách mohou implicitně zrušit rodiče, ale zdroje alokované uvnitř dítěte nemusí být uvolněny.
  • "Studené" proudy (Flow) a správa životního cyklu: Flow je přirozeně líné a vyžaduje aktivní sběr dat. Pokud není sběr správně řízen (například pomocí flowWithLifecycle nebo collectLatest), může dojít k nežádoucímu chování při změnách stavu UI nebo životního cyklu.
  • Blokující volání: Začlenění blokujících volání (například síťových nebo souborových operací) do korutiny, která běží na hlavním dispatcheru (Dispatchers.Main), povede k ANR.
// Příklad potenciálního problému s zrušením korutiny při změně konfigurace
class MyViewModel : ViewModel() {
    fun loadData() {
        viewModelScope.launch {
            // Dlouhá operace
            delay(5000)
            // Pokud je Activity znovu vytvořena během delay, tato řádka nemusí být provedena
            println("Data načtena")
        }
    }
}

// Příklad blokujícího volání na hlavním dispatcheru
import kotlinx.coroutines.*

fun performBlockingOperation() {
    runBlocking { // Nepoužívejte v UI vlákně!
        delay(1000) // Blokuje vlákno
    }
}

// Mělo by to být takto:
fun performNonBlockingOperation() {
    CoroutineScope(Dispatchers.Default).launch {
        delay(1000) // Neblokuje hlavní vlákno
    }
}