Sobes.tech
Middle

Cum lucrezi cu operații asincrone?

sobes.tech AI

Răspuns de la AI

Folosesc următoarele mecanisme:

  • Corutine (Corutine Kotlin): Metoda preferată pentru concurența structurată. Permite scrierea codului asincron în stil imperativ.
    • launch: Pornește o nouă corutină în fundal.
    • async/await: Execută o operație asincronă și returnează rezultatul (Deferred).
    • Contexte (Dispatchers): Definește grupul de fire pentru executarea corutinei (Main, IO, Default).
    • Concurența structurată: Zonele de vizibilitate (CoroutineScope) anulează automat corutinele copil la anularea părintelui.
  • RxJava (Extensii Reactive pentru Java): Lucru cu fluxuri de date asincrone.
    • Observable/Flowable: Emit o secvență de elemente.
    • Operatori (map, filter, flatMap și altele): Transformare și combinare de fluxuri.
    • Planificatori (Schedulers): Definirea firelor pentru executarea operațiunilor.
  • Callbacks: Mecanism simplu pentru callback-uri la finalizarea operației. Pot duce la "Callback Hell" în logica complexă.
  • AsyncTask (învechit): A fost folosit pentru executarea operațiunilor lungi în fundal și actualizarea UI în thread-ul principal. Nu se recomandă în proiecte noi.
  • Threads (Fire Java): Mecanism de nivel inferior pentru gestionarea firelor. Necesită gestionare manuală a ciclului de viață și sincronizare.

Exemplu de utilizare a corutinelor:

// Pornirea unei operațiuni asincrone în thread-ul IO și actualizarea UI în thread-ul Main
lifecycleScope.launch(Dispatchers.IO) {
    val data = fetchDataFromNetwork() // Operațiune lungă
    withContext(Dispatchers.Main) {
        updateUI(data) // Actualizare UI
    }
}

Exemplu de utilizare RxJava:

// Exemplu de obținere a datelor din rețea și procesarea rezultatului
Observable.fromCallable(() -> fetchDataFromNetwork())
    .subscribeOn(Schedulers.io()) // Executare în thread-ul IO
    .observeOn(AndroidSchedulers.mainThread()) // Obținerea rezultatului în thread-ul principal
    .subscribe(data -> updateUI(data), error -> handleError(error));

Alegerea mecanismului depinde de sarcină: corutine pentru programare asincronă generală, RxJava pentru fluxuri de date, callback-uri pentru cazuri simple.