Middle
Jak pracujete s asynchronními operacemi?
sobes.tech AI
Odpověď od AI
Používám následující mechanismy:
- Kotlin Coroutines: Preferovaný způsob pro strukturovanou konkurenci. Umožňuje psát asynchronní kód v imperativním stylu.
launch: Spustí novou coroutine na pozadí.async/await: Provádí asynchronní operaci a vrací výsledek (Deferred).- Kontexty (
Dispatchers): Určují skupinu vláken pro spuštění coroutine (Main,IO,Default). - Strukturovaná konkurence: Oblasti viditelnosti (
CoroutineScope) automaticky ruší podřízené coroutine při zrušení rodiče.
- RxJava (Reaktivní rozšíření pro Java): Práce s asynchronními datovými proudy.
Observable/Flowable: Vydávají sekvenci prvků.- Operátory (map, filter, flatMap atd.): Transformace a spojování proudů.
- Plánovače (
Schedulers): Určují vlákna pro provádění operací.
- Callbacks: Jednoduchý mechanismus zpětných volání při dokončení operace. Může vést k "Callback Hell" v složité logice.
- AsyncTask (zastaralé): Používalo se k provádění dlouhotrvajících operací na pozadí a aktualizaci UI v hlavním vlákně. Nedoporučuje se v nových projektech.
- Vlákna (Java Threads): Nízkourovňový mechanismus správy vláken. Vyžaduje ruční správu životního cyklu a synchronizaci.
Příklad použití korutin:
// Spuštění asynchronní operace na vlákně IO a aktualizace UI na vlákně Main
lifecycleScope.launch(Dispatchers.IO) {
val data = fetchDataFromNetwork() // Dlouhá operace
withContext(Dispatchers.Main) {
updateUI(data) // Aktualizace UI
}
}
Příklad použití RxJava:
// Příklad získání dat ze sítě a zpracování výsledku
Observable.fromCallable(() -> fetchDataFromNetwork())
.subscribeOn(Schedulers.io()) // Běh na vlákně IO
.observeOn(AndroidSchedulers.mainThread()) // Výsledek na hlavním vlákně
.subscribe(data -> updateUI(data), error -> handleError(error));
Volba mechanismu závisí na úkolu: korutiny pro obecné asynchronní programování, RxJava pro práci s datovými proudy, callbacky pro jednoduché případy.