RxJava: मूल बातें, ReactiveX और डेटा स्ट्रीम के साथ काम करना

लेखक: IT Sectr प्रकाशित: 2026-03-16 पढ़ने का समय: 8 मिनट

RxJava जावा और Android के लिए एक रिएक्टिव प्रोग्रामिंग लाइब्रेरी है जो Observable और Observer के माध्यम से Observer पैटर्न को लागू करती है। ReactiveX GitHub, 2026 के अनुसार, RxJava ऑपरेटर चेन का उपयोग करके एसिंक्रोनस डेटा स्ट्रीम और इवेंट को संभालने में सक्षम बनाता है। मूल इकाई Observable है, जो ट्रांसफ़ॉर्मेशन की एक श्रृंखला के माध्यम से Observer को डेटा एमिट करता है। RxJava 3 वर्तमान स्थिर संस्करण है जो Java 8 lambda, Reactive Streams और RxAndroid के माध्यम से Android एकीकरण का समर्थन करता है।

मुख्य बातें

  • RxJava — एसिंक्रोनस डेटा स्ट्रीम प्रोसेसिंग के लिए ReactiveX का जावा कार्यान्वयन
  • Observable — डेटा स्रोत जो Observer को एलिमेंट एमिट करता है
  • Observer — सब्सक्राइबर जो onNext, onError और onComplete नोटिफिकेशन प्राप्त करता है
  • ऑपरेटर — स्ट्रीम को ट्रांसफ़ॉर्म, फ़िल्टर और संयोजित करने के लिए फ़ंक्शन की श्रृंखला
  • Schedulers — Observable और Observer के निष्पादन थ्रेड को प्रबंधित करने के लिए घटक

RxJava और ReactiveX क्या है

RxJava ReactiveX विनिर्देश का जावा कार्यान्वयन है, जो ऑब्ज़र्वेबल स्ट्रीम (Observable) का उपयोग करके एसिंक्रोनस प्रोग्रामिंग के लिए एक लाइब्रेरी है। RxJava 2 2016 में Reactive Streams (Flowable) समर्थन और rx.Observable तथा io.reactivex.Observable में विभाजन के साथ जारी किया गया था। RxJava 3 (2019) RxJava 2 के साथ पिछड़ी संगतता वाला वर्तमान प्रमुख संस्करण है।

RxJava का मूल विचार यह है कि सब कुछ एक स्ट्रीम है: डेटा स्ट्रीम, इवेंट स्ट्रीम, स्टेट स्ट्रीम। किसी भी एसिंक्रोनस ऑपरेशन को Observable के रूप में दर्शाया जा सकता है जो डेटा, त्रुटि या पूर्णता संकेत एमिट करता है। एक Observer Observable की सदस्यता लेता है और रीयल टाइम में नोटिफिकेशन प्राप्त करता है।

Badoo (2024) के अनुसार, coroutines में संक्रमण से पहले, Google Play के शीर्ष 200 में से 76% Android ऐप्स एसिंक्रोनस ऑपरेशन के लिए RxJava का उपयोग करते थे। अब यह हिस्सा coroutines के पक्ष में घट रहा है, लेकिन RxJava हजारों ऐप्स के प्रोडक्शन कोड में बना हुआ है और इसे एक परिपक्व, परीक्षित तकनीक माना जाता है। ReactiveX एक क्रॉस-प्लेटफ़ॉर्म विनिर्देश है जिसे JavaScript (RxJS), .NET (Rx.NET), Swift (RxSwift) और अन्य भाषाओं के लिए भी लागू किया गया है।

RxJava में Observer पैटर्न

ReactiveX क्लासिक Observer पैटर्न को दो तंत्रों के साथ विस्तारित करता है: ऑपरेटर चेनिंग और Scheduler-आधारित थ्रेडिंग। Observable जब तक कोई Observer सब्सक्राइब नहीं करता तब तक डेटा एमिट करना शुरू नहीं करता (लेज़ी इवैल्यूएशन)। यह एक डेटा पाइपलाइन बनाने की अनुमति देता है जो केवल सब्सक्रिप्शन होने पर ही सक्रिय होती है।

Observable प्रकार: Observable, Flowable, Single, Maybe, Completable

Observable — onError या onComplete के साथ 0..N एलिमेंट एमिट करने वाला आधार प्रकार। असीमित डेटा स्ट्रीम के लिए उपयुक्त — उदाहरण के लिए, क्लिक इवेंट या जियोलोकेशन अपडेट। Observable बैकप्रेशर का समर्थन नहीं करता।

Flowable — बैकप्रेशर समर्थन के साथ Observable का Reactive Streams संस्करण। इसका उपयोग तब किया जाता है जब डेटा स्रोत Observer की प्रोसेसिंग गति से तेज़ एलिमेंट उत्पन्न कर सकता है। Flowable BACKPRESSURE_BUFFER, DROP, LATEST और ERROR रणनीतियों का समर्थन करता है।

प्रकारएलिमेंटबैकप्रेशरउपयोग
Observable0..NनहींUI इवेंट, छोटी स्ट्रीम
Flowable0..Nहाँबड़ा डेटा, रीयल-टाइम
Single1 (onSuccess/onError)एकल प्रतिक्रिया (नेटवर्क)
Maybe0..1वैकल्पिक मान (कैश)
Completable0 (onComplete/onError)डेटा के बिना ऑपरेशन (लेखन)

Single, Maybe और Completable

Single बिल्कुल एक एलिमेंट या त्रुटि एमिट करता है — नेटवर्क अनुरोधों के लिए आदर्श। Maybe 0 या 1 एलिमेंट एमिट करता है, कैश के लिए उपयुक्त जहाँ डेटा अनुपस्थित हो सकता है। Completable डेटा के बिना केवल onComplete या onError एमिट करता है, लेखन या हटाने के संचालन के लिए सुविधाजनक। ये प्रकार अनुबंध को एक विशिष्ट मामले तक सीमित करके API को सरल बनाते हैं। Retrofit (Android के लिए एक लोकप्रिय HTTP क्लाइंट) सभी पाँच RxJava प्रकारों का सीधे समर्थन करता है, जिससे आप बिना अतिरिक्त कोड के प्रत्येक एंडपॉइंट के लिए सबसे उपयुक्त रिटर्न प्रकार चुन सकते हैं।

RxJava ऑपरेटर: स्ट्रीम ट्रांसफ़ॉर्मेशन और फ़िल्टरिंग

ऑपरेटर ऐसे फ़ंक्शन हैं जो एक Observable को दूसरे में बदलते हैं। ऑपरेटर चेन डेटा पाइपलाइन का वर्णन करती है: प्रत्येक ऑपरेटर पिछले से स्ट्रीम लेता है, उसे रूपांतरित करता है और अगले को भेजता है। RxJava में श्रेणियों में समूहित 200 से अधिक ऑपरेटर हैं।

  • map — प्रत्येक एलिमेंट को रूपांतरित करता है (Integer → String)
  • flatMap — एक एलिमेंट को Observable में बदलता है और सभी को एक स्ट्रीम में मर्ज करता है
  • filter — शर्त पूरा करने वाले एलिमेंट को पास करता है
  • zip — N Observables से एलिमेंट को इंडेक्स द्वारा जोड़ता है
  • merge — कई Observables को एक में मर्ज करता है, कालानुक्रमिक क्रम बनाए रखता है
  • debounce — केवल तब एलिमेंट एमिट करता है जब बिना किसी अन्य एमिशन के निर्दिष्ट समय बीत जाए

flatMap सबसे शक्तिशाली RxJava ऑपरेटरों में से एक है। यह प्रत्येक एलिमेंट के लिए एक एसिंक्रोनस अनुरोध निष्पादित करने और परिणामों को एक सामान्य स्ट्रीम में एकत्र करने की अनुमति देता है। उदाहरण के लिए, flatMap का उपयोग ID की सूची से विवरण लोड करने के लिए किया जाता है: प्रत्येक ID → नेटवर्क अनुरोध → परिणामों का मर्ज। map के विपरीत, जो केवल एक एलिमेंट को रूपांतरित करता है, flatMap कई एलिमेंट एमिट कर सकता है या किसी अन्य Observable पर स्विच कर सकता है, जो इसे एसिंक्रोनस पाइपलाइन बनाने की नींव बनाता है।

ऑपरेटरों के साथ त्रुटि प्रबंधन

onErrorResumeNext — त्रुटि पर बैकअप Observable पर स्विच करता है। retry — त्रुटि पर N बार पुनः सब्सक्राइब करता है। onErrorReturn — त्रुटि के बजाय डिफ़ॉल्ट मान लौटाता है। doOnError — स्ट्रीम को बदले बिना त्रुटि पर दुष्प्रभाव निष्पादित करता है (लॉगिंग या एनालिटिक्स)। इन ऑपरेटरों का संयोजन मैन्युअल try/catch के बिना स्पष्ट त्रुटि प्रबंधन रणनीति के साथ मजबूत पाइपलाइन बनाने की अनुमति देता है।

Schedulers: RxJava में थ्रेड प्रबंधन

Schedulers यह निर्धारित करते हैं कि Observable और Observer किस थ्रेड पर निष्पादित होते हैं। subscribeOn स्रोत के लिए थ्रेड सेट करता है, observeOn Observer और बाद के ऑपरेटरों के लिए थ्रेड सेट करता है। यह पृथक्करण RxJava का एक प्रमुख लाभ है: स्रोत IO थ्रेड पर, प्रोसेसिंग computation पर, UI मुख्य थ्रेड पर।

मुख्य Schedulers: Schedulers.io() — I/O संचालन (नेटवर्क, डिस्क) के लिए, असीमित पूल। Schedulers.computation() — गणना के लिए, कोर की संख्या के अनुसार निश्चित पूल। Schedulers.newThread() — प्रत्येक कार्य के लिए नया थ्रेड। AndroidSchedulers.mainThread() — Android मुख्य थ्रेड (RxAndroid)। Schedulers.trampoline() भी है जो FIFO क्यू के साथ वर्तमान थ्रेड में कार्य निष्पादित करने के लिए है, परीक्षणों के लिए उपयोगी।

Google (2025) के अनुसार, शुरुआती लोगों के लिए Schedulers का सही उपयोग RxJava का सबसे कठिन हिस्सा है। एक सामान्य गलती observeOn के बाद subscribeOn को कॉल करना है, जो स्रोत को प्रभावित नहीं करता। subscribeOn स्रोत के लिए श्रृंखला में पहला होना चाहिए, observeOn UI सब्सक्रिप्शन से पहले। नियम: subscribeOn केवल अपस्ट्रीम (स्रोत) को प्रभावित करता है, observeOn डाउनस्ट्रीम (सब्सक्राइबर और उसके बाद के सभी ऑपरेटर) को स्विच करता है।

Android में RxJava कोड उदाहरण

तीन परिदृश्यों पर विचार करें: Single के साथ नेटवर्क अनुरोध, zip के साथ समानांतर अनुरोध, और debounce के साथ खोज फ़ील्ड के लिए डिबाउंस।

Single के साथ नेटवर्क अनुरोध

Single Retrofit अनुरोधों के लिए एकदम सही है: एक अनुरोध — एक प्रतिक्रिया। UI अपडेट के लिए मुख्य थ्रेड पर सब्सक्राइब करें।

java
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 के साथ समानांतर अनुरोध

zip दो स्वतंत्र Single के परिणामों को एक में जोड़ता है। वे समानांतर में निष्पादित होते हैं, दोनों के पूर्ण होने के बाद परिणाम उत्पन्न होता है।

java
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 तेज़ टेक्स्ट परिवर्तनों को अनदेखा करता है और केवल 400 ms के ठहराव के बाद अनुरोध भेजता है। distinctUntilChanged यदि टेक्स्ट नहीं बदला है तो अनुरोध रद्द करता है।

java
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 बनाम Kotlin Coroutines: दृष्टिकोणों की तुलना

RxJava और Kotlin Coroutines एक ही समस्या — एसिंक्रोनस प्रोग्रामिंग — को हल करते हैं लेकिन मौलिक रूप से भिन्न दृष्टिकोणों के साथ। RxJava Observer पैटर्न पर बना है और push-आधारित है: स्रोत डेटा भेजता है, Observer प्रतिक्रिया करता है। Coroutines pull-आधारित हैं: कोड await के माध्यम से क्रमिक रूप से डेटा का अनुरोध करता है।

  • RxJava — रिएक्टिव, डेटा स्ट्रीम, >200 ऑपरेटर, push-आधारित, कठिन सीखने की अवस्था
  • Coroutines — अनुक्रमिक, suspend/await, ~40 फ़ंक्शन, pull-आधारित, सरल सिंटैक्स
  • RxJava — परिपक्व (2016), विशाल पारिस्थितिकी तंत्र, लेकिन कठिन सीखने की अवस्था
  • Coroutines — आधुनिक (2018), नए कोड के लिए Google की पसंदीदा पसंद
  • RxJava — Flowable के माध्यम से अंतर्निर्मित बैकप्रेशर, अच्छी तरह से परीक्षित बफरिंग रणनीतियाँ
  • Coroutines — बैकप्रेशर के साथ Flow हाल ही का है, लेकिन JetBrains द्वारा सक्रिय रूप से विकसित

Google I/O 2024 के अनुसार, Kotlin Coroutines Android में नए एसिंक्रोनस कोड के लिए अनुशंसित दृष्टिकोण है। RxJava मौजूदा परियोजनाओं के लिए समर्थित बना हुआ है। Google क्रमिक माइग्रेशन के लिए ब्रिजिंग लाइब्रेरी (kotlinx-coroutines-rx3) प्रदान करता है। AndroidX (LiveData, Room, Paging 3) दोनों दृष्टिकोणों का समर्थन करता है, जिससे निर्भरता संघर्ष के बिना पुराने मॉड्यूल में RxJava और नए में coroutines का उपयोग किया जा सकता है।

RxJava से Coroutines में माइग्रेशन रणनीति

क्रमिक संक्रमण: प्रत्येक नया घटक coroutines के साथ लिखा जाता है, पुराना RxJava कोड अछूता छोड़ दिया जाता है। RxJava → coroutines awaitSingle() या awaitFirst() के माध्यम से। Coroutines → RxJava future() या asFlowable() के माध्यम से। बड़ी परियोजनाओं के लिए पूर्ण माइग्रेशन में 6–18 महीने लगते हैं।

अक्सर पूछे जाने वाले प्रश्न

Observable Flowable से कैसे भिन्न है?

Observable बैकप्रेशर का समर्थन नहीं करता — यदि स्रोत हैंडलर की प्रोसेसिंग गति से तेज़ डेटा उत्पन्न करता है, तो MissingBackpressureException होता है। Flowable कॉन्फ़िगरेबल बफरिंग रणनीतियों के साथ Reactive Streams बैकप्रेशर का समर्थन करता है।

subscribeOn और observeOn क्या हैं?

subscribeOn स्रोत Observable को निष्पादित करने के लिए Scheduler सेट करता है। observeOn श्रृंखला में Observer और सभी बाद के ऑपरेटरों के लिए Scheduler सेट करता है। subscribeOn अपस्ट्रीम को प्रभावित करता है, observeOn डाउनस्ट्रीम को प्रभावित करता है।

क्या मुझे RxJava से coroutines पर स्विच करना चाहिए?

नई परियोजनाओं के लिए — हाँ, Google coroutines की अनुशंसा करता है। मौजूदा परियोजनाओं के लिए — kotlinx-coroutines-rx3 के माध्यम से क्रमिक माइग्रेशन। RxJava पुराने कोड के लिए स्थिर और समर्थित बना हुआ है।

RxJava में त्रुटियों को कैसे संभालें?

ऑपरेटरों के माध्यम से: onErrorReturn (डिफ़ॉल्ट मान), onErrorResumeNext (बैकअप Observable), retry (N बार पुनः प्रयास)। या उपयोगकर्ता को दिखाने के लिए Observer.onError() के माध्यम से।

CompositeDisposable क्या है?

CompositeDisposable कई सब्सक्रिप्शन के प्रबंधन के लिए एक कंटेनर है। जब dispose() कॉल किया जाता है, तो सभी जोड़े गए सब्सक्रिप्शन रद्द कर दिए जाते हैं। इसका उपयोग Activity/Fragment में स्क्रीन नष्ट होने पर सभी अनुरोधों को रद्द करने के लिए किया जाता है।

सारांश

  • RxJava — Observer पैटर्न पर आधारित Java और Android के लिए रिएक्टिव प्रोग्रामिंग लाइब्रेरी
  • Observable/Flowable — बैकप्रेशर समर्थन के साथ और बिना डेटा स्रोत
  • Single, Maybe, Completable — 1, 0..1 और 0 एलिमेंट के लिए विशेष प्रकार
  • ऑपरेटर (map, flatMap, zip, filter) — 200 से अधिक फ़ंक्शन के साथ रूपांतरण श्रृंखला
  • Schedulers — स्रोत के लिए subscribeOn और उपभोक्ता के लिए observeOn
  • RxJava बनाम Coroutines — Google द्वारा नए कोड के लिए coroutines अनुशंसित, RxJava पुराने के लिए
  • CompositeDisposable — स्क्रीन नष्ट होने पर रद्दीकरण के साथ सुरक्षित सब्सक्रिप्शन प्रबंधन

हम एक मोबाइल एप्लिकेशन टर्नकी विकसित करेंगे

IT Sectr 2017 से स्टार्टअप और व्यवसायों के लिए iOS और Android एप्लिकेशन बनाता है। हम आपको सलाह देंगे और सर्वोत्तम समाधान प्रस्तावित करेंगे।

परियोजना पर चर्चा करें

यह भी पढ़ें