RxJava är ett bibliotek för reaktiv programmering för Java och Android som implementerar Observer-mönstret via Observable och Observer. Enligt ReactiveX GitHub, 2026 gör RxJava det möjligt att bearbeta asynkrona dataströmmar och händelser med hjälp av operatörskedjor. Grundenheten är Observable som skickar data till Observer via en transformationskedja. RxJava 3 är den nuvarande stabila versionen med stöd för Java 8 lambda, Reactive Streams och integration med Android via RxAndroid.
Huvudpunkter
RxJava — Java-implementeringen av ReactiveX-specifikationen, ett bibliotek för asynkron programmering med hjälp av observerbara strömmar (Observable). RxJava 2 släpptes 2016 med stöd för Reactive Streams (Flowable) och uppdelning i rx.Observable och io.reactivex.Observable. RxJava 3 (2019) — nuvarande huvudversion med bakåtkompatibilitet med RxJava 2.
Grundidén med RxJava — allt är en ström: dataström, händelseström, tillståndsström . Alla asynkrona operationer kan representeras som en Observable som skickar data, fel eller slutsignal. Observer prenumererar på Observable och tar emot meddelanden i realtid.
Enligt Badoo-data (2024) använde 76% av Android-apparna från top-200 Google Play RxJava för asynkrona operationer innan övergången till korutiner. Nu minskar andelen till förmån för korutiner, men RxJava finns kvar i produktionskoden för tusentals appar och anses vara en mogen, beprövad teknik. ReactiveX — en plattformsoberoende specifikation, även implementerad för JavaScript (RxJS), .NET (Rx.NET), Swift (RxSwift) och andra språk.
ReactiveX utökar det klassiska Observer-mönstret med två mekanismer: operatörskedja (operator chaining) och trådhantering (schedulers). Observable börjar inte skicka data förrän Observer prenumererar (lat utvärdering). Detta gör det möjligt att bygga en datapipeline som endast aktiveras vid en prenumeration.
Observable — grundtyp som skickar 0..N element med onError eller onComplete. Lämplig för dataströmmar av obegränsad längd — till exempel klickhändelser eller platsuppdateringar. Observable stöder inte backpressure.
Flowable — Reactive Streams-versionen av Observable med stöd för backpressure. Används när datakällan kan generera element snabbare än Observer hinner bearbeta. Flowable stöder strategierna BACKPRESSURE_BUFFER, DROP, LATEST och ERROR.
| Typ | Element | Backpressure | Användning |
|---|---|---|---|
| Observable | 0..N | Nej | UI-händelser, små strömmar |
| Flowable | 0..N | Ja | Stora data, realtid |
| Single | 1 (onSuccess/onError) | — | Enskilt svar (nätverk) |
| Maybe | 0..1 | — | Valfritt värde (cache) |
| Completable | 0 (onComplete/onError) | Operation utan data (skrivning) |
Single skickar exakt ett element eller fel — idealiskt för nätverksförfrågningar. Maybe — 0 eller 1 element, lämplig för cache där data kan saknas. Completable — endast onComplete eller onError, utan data, bekväm för skriv- eller borttagningsoperationer. Dessa typer förenklar API:et genom att begränsa kontraktet till ett specifikt fall. Retrofit (den populära HTTP-klienten för Android) stöder alla fem RxJava-typer direkt, vilket gör att du kan välja den mest lämpliga returtypen för varje slutpunkt utan onödig omslag.
Operatorer är funktioner som omvandlar en Observable till en annan. Operatörskedjan (operator chain) beskriver datapipelinen: varje operator tar emot strömmen från den föregående, transformerar den och skickar den vidare till nästa. RxJava innehåller över 200 operatorer indelade i kategorier.
flatMap — en av de kraftfullaste operatorerna i RxJava. Det gör det möjligt att utföra en asynkron begäran för varje element och samla resultaten i en gemensam ström. Till exempel används flatMap för att ladda detaljer baserat på en lista med ID:n: varje ID → nätverksbegäran → kombinera resultat. Till skillnad från map som helt enkelt omvandlar ett element, kan flatMap skicka flera element eller växla till en annan Observable, vilket gör det till grunden för att bygga asynkrona pipelines.
onErrorResumeNext — växlar vid fel till en reserv-Observable. retry — upprepar prenumerationen vid fel N gånger. onErrorReturn — returnerar ett standardvärde istället för fel. doOnError — utför en sidoeffekt vid fel utan att ändra strömmen (loggning eller analys). Kombinationen av dessa operatorer gör det möjligt att bygga pålitliga pipelines med en tydlig strategi för felhantering utan manuell try/catch.
Schedulers bestämmer på vilken tråd Observable och Observer exekveras. subscribeOn ställer in tråden för källan, observeOn — tråden för Observer och efterföljande operatorer. Denna separation — den största fördelen med RxJava: källan på IO-tråden, bearbetning på computation, UI — på huvudtråden.
Huvudsakliga Schedulers: Schedulers.io() — för I/O-operationer (nätverk, disk), obegränsad pool. Schedulers.computation() — för beräkningar, fast pool baserat på antal kärnor. Schedulers.newThread() — ny tråd för varje uppgift. AndroidSchedulers.mainThread() — Android-huvudtråden (RxAndroid). Det finns också Schedulers.trampoline() för att utföra uppgifter på den aktuella tråden med FIFO-kö, användbart för tester.
Enligt Google-data (2025) är korrekt användning av Schedulers det svåraste i RxJava för nybörjare. Typiskt misstag — att anropa subscribeOn efter observeOn, vilket inte påverkar källan. subscribeOn måste vara först i kedjan för källan, observeOn — före UI-prenumerationen. Regel: subscribeOn påverkar endast upstream (källan), observeOn växlar downstream (prenumeranten och alla operatorer efter den).
Låt oss titta på tre scenarier: nätverksbegäran med Single, parallella begäranden med zip och debounce för sökfältet med debounce.
Single är idealiskt för Retrofit-begäranden: en begäran — ett svar. Prenumeration på huvudtråden för UI-uppdatering.
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 kombinerar resultaten av två oberoende Single till ett. De körs parallellt, resultatet — efter att båda är klara.
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 ignorerar snabba textändringar och skickar begäran först efter 400 ms paus. distinctUntilChanged avbryter begäran om texten inte har ändrats.
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 och Kotlin Coroutines löser samma uppgift — asynkron programmering — men med fundamentalt olika tillvägagångssätt. RxJava är byggt på Observer-mönstret och är push-baserat: källan skickar data, Observer reagerar. Korutiner är pull-baserade: koden hämtar data sekventiellt via await.
Enligt Google I/O 2024 är Kotlin Coroutines det rekommenderade tillvägagångssättet för ny asynkron kod i Android. RxJava förblir supporterat för befintliga projekt. Google tillhandahåller övergångsbibliotek (kotlinx-coroutines-rx3) för gradvis migrering. AndroidX (LiveData, Room, Paging 3) stöder båda tillvägagångssätten, vilket gör det möjligt att använda RxJava i gamla moduler och korutiner i nya moduler utan beroendekonflikter.
Gradvis övergång: varje ny komponent skrivs med korutiner, gammal RxJava-kod rörs inte. RxJava → korutiner via awaitSingle() eller awaitFirst(). Korutiner → RxJava via future() eller asFlowable(). Full migrering tar 6–18 månader för stora projekt.
Vanliga frågor
Observable stöder inte backpressure — om källan genererar data snabbare än processorn uppstår MissingBackpressureException. Flowable stöder Reactive Streams backpressure med en konfigurerbar bufferstrategi.
subscribeOn ställer in Scheduler för exekvering av Observable-källan. observeOn ställer in Scheduler för Observer och alla efterföljande operatorer i kedjan. subscribeOn påverkar upstream, observeOn — downstream.
För nya projekt — ja, Google rekommenderar korutiner. För befintliga projekt — gradvis migrering via kotlinx-coroutines-rx3. RxJava förblir stabilt och supporterat för gammal kod.
Via operatorer: onErrorReturn (standardvärde), onErrorResumeNext (reserv-Observable), retry (försök igen N gånger). Eller via Observer.onError() för att visa för användaren.
CompositeDisposable — en behållare för att hantera flera prenumerationer. Vid dispose() avbryts alla tillagda prenumerationer. Används i Activity/Fragment för att avbryta alla begäranden när skärmen förstörs.
Sammanfattning
Vi utvecklar en mobil applikation nyckelfärdigt
IT Sectr skapar iOS- och Android-applikationer för startups och företag sedan 2017. Vi ger dig råd och föreslår den bästa lösningen.
Läs också