Sobes.tech
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.