RxJava je knihovna reaktivního programování pro Java a Android, která implementuje vzor Observer pomocí Observable a Observer. Podle ReactiveX GitHub, 2026 umožňuje RxJava zpracovávat asynchronní datové toky a události pomocí řetězců operátorů. Základní jednotkou je Observable, která emituje data Observeru prostřednictvím transformačního řetězce. RxJava 3 je aktuální stabilní verze s podporou Java 8 lambda, Reactive Streams a integrací s Androidem přes RxAndroid.
Hlavní body
RxJava — Java implementace specifikace ReactiveX, knihovna pro asynchronní programování pomocí pozorovatelných toků (Observable). RxJava 2 byla vydána v roce 2016 s podporou Reactive Streams (Flowable) a rozdělením na rx.Observable a io.reactivex.Observable. RxJava 3 (2019) — aktuální hlavní verze se zpětnou kompatibilitou s RxJava 2.
Základní myšlenka RxJava — vše je tok: datový tok, tok událostí, tok stavů. Jakoukoli asynchronní operaci lze reprezentovat jako Observable emitující data, chybu nebo signál dokončení. Observer se přihlásí k odběru Observable a dostává oznámení v reálném čase.
Podle údajů Badoo (2024) před přechodem na korutiny používalo 76% Android aplikací z top-200 Google Play RxJava pro asynchronní operace. Nyní podíl klesá ve prospěch korutin, ale RxJava zůstává v produkčním kódu tisíců aplikací a je považována za zralou, osvědčenou technologii. ReactiveX — multiplatformní specifikace, implementovaná také pro JavaScript (RxJS), .NET (Rx.NET), Swift (RxSwift) a další jazyky.
ReactiveX rozšiřuje klasický vzor Observer o dva mechanismy: řetězec operátorů (operator chaining) a správu vláken (schedulers). Observable nezačne emitovat data, dokud se Observer nepřihlásí (líné vyhodnocování). To umožňuje vytvořit datový pipeline, který se aktivuje pouze při existenci odběru.
Observable — základní typ emitující 0..N prvků s onError nebo onComplete. Vhodný pro datové toky neomezené délky — například události kliknutí nebo aktualizace geolokace. Observable nepodporuje backpressure.
Flowable — verze Reactive Streams Observable s podporou backpressure. Používá se, když zdroj dat může generovat prvky rychleji, než Observer stíhá zpracovávat. Flowable podporuje strategie BACKPRESSURE_BUFFER, DROP, LATEST a ERROR.
| Typ | Prvků | Backpressure | Použití |
|---|---|---|---|
| Observable | 0..N | Ne | Události UI, malé toky |
| Flowable | 0..N | Ano | Velká data, reálný čas |
| Single | 1 (onSuccess/onError) | — | Jednotlivá odpověď (síť) |
| Maybe | 0..1 | — | Volitelná hodnota (cache) |
| Completable | 0 (onComplete/onError) | Operace bez dat (zápis) |
Single emituje přesně jeden prvek nebo chybu — ideální pro síťové požadavky. Maybe — 0 nebo 1 prvek, vhodný pro cache, kde data mohou chybět. Completable — pouze onComplete nebo onError, bez dat, vhodný pro operace zápisu nebo mazání. Tyto typy zjednodušují API tím, že omezují smlouvu na konkrétní případ. Retrofit (populární HTTP klient pro Android) podporuje všech pět typů RxJava přímo a umožňuje vybrat nejvhodnější návratový typ pro každý endpoint bez zbytečného obalu.
Operátory jsou funkce, které transformují jeden Observable na jiný. Řetězec operátorů (operator chain) popisuje datový pipeline: každý operátor přijímá tok od předchozího, transformuje ho a předává dalšímu. RxJava obsahuje více než 200 operátorů rozdělených do kategorií.
flatMap — jeden z nejsilnějších operátorů RxJava. Umožňuje provést asynchronní požadavek pro každý prvek a shromáždit výsledky do společného toku. Například flatMap se používá pro načítání podrobností podle seznamu ID: každé ID → síťový požadavek → spojení výsledků. Na rozdíl od map, který jednoduše transformuje prvek, flatMap může emitovat více prvků nebo přepnout na jiný Observable, což z něj činí základ pro vytváření asynchronních pipeline.
onErrorResumeNext — při chybě přepne na záložní Observable. retry — opakuje odběr při chybě N-krát. onErrorReturn — vrací výchozí hodnotu místo chyby. doOnError — provádí vedlejší akci při chybě bez změny toku (logování nebo analytika). Kombinace těchto operátorů umožňuje vytvářet spolehlivé pipeline s jasnou strategií zpracování selhání bez ručního try/catch.
Schedulers určují, na kterém vlákně se provádí Observable a Observer. subscribeOn nastavuje vlákno pro zdroj, observeOn — vlákno pro Observer a následující operátory. Toto oddělení — klíčová výhoda RxJava: zdroj na IO vlákně, zpracování na computation, UI — na hlavním vlákně.
Hlavní Schedulers: Schedulers.io() — pro I/O operace (síť, disk), neomezený pool. Schedulers.computation() — pro výpočty, pevný pool podle počtu jader. Schedulers.newThread() — nové vlákno pro každý úkol. AndroidSchedulers.mainThread() — hlavní vlákno Androidu (RxAndroid). Existuje také Schedulers.trampoline() pro provádění úkolů v aktuálním vlákně s frontou FIFO, užitečné pro testy.
Podle údajů Google (2025) je správné použití Schedulers to nejtěžší v RxJava pro začátečníky. Typická chyba — volání subscribeOn po observeOn, které neovlivňuje zdroj. subscribeOn by měl být první v řetězci pro zdroj, observeOn — před UI odběrem. Pravidlo: subscribeOn ovlivňuje pouze upstream (zdroj), observeOn přepíná downstream (předplatitele a všechny operátory po něm).
Podívejme se na tři scénáře: síťový požadavek s Single, paralelní požadavky s zip a debounce pro vyhledávací pole s debounce.
Single je ideální pro Retrofit požadavky: jeden požadavek — jedna odpověď. Odběr na hlavním vlákně pro aktualizaci UI.
api.getUser(id)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new SingleObserver<User>() {
@Override
public void onSuccess(User user) { showUser(user); }
@Override
public void onError(Throwable e) { showError(e); }
})
zip spojuje výsledky dvou nezávislých Single do jednoho. Provádějí se paralelně, výsledek — po dokončení obou.
Single.zip(
api.getProfile(),
api.getSettings(),
(profile, settings) -> new Dashboard(profile, settings)
)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(dashboard -> showDashboard(dashboard), e -> logError(e))
debounce ignoruje rychlé změny textu a odesílá požadavek až po 400 ms pauze. distinctUntilChanged ruší požadavek, pokud se text nezměnil.
RxTextView.textChanges(searchView)
.debounce(400, TimeUnit.MILLISECONDS)
.filter(text -> text.length() >= 3)
.distinctUntilChanged()
.switchMap(query -> api.search(query))
.observeOn(AndroidSchedulers.mainThread())
.subscribe(results -> showResults(results))
RxJava a Kotlin Coroutines řeší stejný úkol — asynchronní programování — ale zásadně odlišnými přístupy. RxJava je postaven na vzoru Observer a je push-based: zdroj odesílá data, Observer reaguje. Korutiny — pull-based: kód sekvenčně získává data pomocí await.
Podle Google I/O 2024 jsou Kotlin Coroutines doporučeným přístupem pro nový asynchronní kód v Androidu. RxJava zůstává podporován pro stávající projekty. Google poskytuje přechodové knihovny (kotlinx-coroutines-rx3) pro postupnou migraci. AndroidX (LiveData, Room, Paging 3) podporuje oba přístupy a umožňuje používat RxJava ve starých modulech a korutiny v nových bez konfliktů závislostí.
Postupný přechod: každá nová komponenta se píše s korutinami, starý kód RxJava se nemění. RxJava → korutiny přes awaitSingle() nebo awaitFirst(). Korutiny → RxJava přes future() nebo asFlowable(). Úplná migrace trvá 6–18 měsíců u velkých projektů.
Často kladené otázky
Observable nepodporuje backpressure — pokud zdroj generuje data rychleji než procesor, dochází k MissingBackpressureException. Flowable podporuje Reactive Streams backpressure s konfigurovatelnou strategií bufferování.
subscribeOn nastavuje Scheduler pro provádění zdroje Observable. observeOn nastavuje Scheduler pro Observer a všechny následující operátory v řetězci. subscribeOn ovlivňuje upstream, observeOn — downstream.
Pro nové projekty — ano, Google doporučuje korutiny. Pro stávající projekty — postupná migrace přes kotlinx-coroutines-rx3. RxJava zůstává stabilní a podporovaný pro starý kód.
Pomocí operátorů: onErrorReturn (výchozí hodnota), onErrorResumeNext (záložní Observable), retry (opakování N-krát). Nebo přes Observer.onError() pro zobrazení uživateli.
CompositeDisposable — kontejner pro správu více odběrů. Při dispose() jsou všechny přidané odběry zrušeny. Používá se v Activity/Fragment ke zrušení všech požadavků při zničení obrazovky.
Shrnutí
Vyvineme mobilní aplikaci na klíč
IT Sectr vytváří aplikace pro iOS a Android pro startupy a podniky od roku 2017. Poradíme vám a navrhneme nejlepší řešení.
Přečtěte si také