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:Flowje přirozeně líné a vyžaduje aktivní sběr dat. Pokud není sběr správně řízen (například pomocíflowWithLifecyclenebocollectLatest), 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
}
}