Subject হলো RxJava এর একটি বিশেষ উপাদান, যা Observable এবং Observer উভয়ের মতো আচরণ করে। এটি একদিকে ডেটা স্ট্রিম গ্রহণ করতে পারে (যেমন একটি Observer), আবার অন্যদিকে সেই ডেটা স্ট্রিমকে একাধিক সাবস্ক্রাইবারের মধ্যে বিতরণ করতে পারে (যেমন একটি Observable)।
Subject কেন প্রয়োজন?
- Multicasting Support:
সাধারণত, একটিObservableডেটা একাধিকObserverএর মধ্যে শেয়ার করতে পারে না। কিন্তুSubjectব্যবহার করে আপনি একই ডেটা স্ট্রিম একাধিকObserverএর মধ্যে শেয়ার করতে পারবেন। - Hot Observable Creation:
Subjectহলো hot observable, যা অর্থ, এটি ডেটা প্রেরণ শুরু করার পর সাবস্ক্রাইবার যুক্ত হলেও শুধুমাত্র বর্তমান ডেটা স্ট্রিম পায়। - Bidirectional Communication:
Subjectডেটা প্রেরণ এবং গ্রহণ উভয় কাজ করতে পারে, যা bidirectional communication এর জন্য উপযুক্ত।
RxJava Subject এর ধরণ
RxJava এ বিভিন্ন প্রকারের Subject রয়েছে। প্রতিটির নির্দিষ্ট আচরণ ও ব্যবহারের ক্ষেত্রে রয়েছে।
১. PublishSubject
- এটি ডেটা স্ট্রিমের শুধুমাত্র বর্তমান এবং পরবর্তী আইটেমগুলোর তথ্য প্রদান করে।
- যখন নতুন
Observerযুক্ত হয়, এটি শুধুমাত্র নতুন ডেটা পায়।
কোড উদাহরণ:
import io.reactivex.rxjava3.subjects.PublishSubject;
public class PublishSubjectExample {
public static void main(String[] args) {
PublishSubject<String> subject = PublishSubject.create();
subject.subscribe(item -> System.out.println("Observer 1: " + item));
subject.onNext("Hello");
subject.onNext("RxJava");
subject.subscribe(item -> System.out.println("Observer 2: " + item)); // নতুন Observer
subject.onNext("World");
}
}
আউটপুট:
Observer 1: Hello
Observer 1: RxJava
Observer 1: World
Observer 2: World
২. BehaviorSubject
- এটি সর্বশেষ
onNext()আইটেম এবং তার পরবর্তী সব আইটেম সরবরাহ করে। - নতুন
Observerসর্বশেষ আইটেম পায় এবং তারপর ডেটা স্ট্রিম অনুসরণ করে।
কোড উদাহরণ:
import io.reactivex.rxjava3.subjects.BehaviorSubject;
public class BehaviorSubjectExample {
public static void main(String[] args) {
BehaviorSubject<String> subject = BehaviorSubject.create();
subject.onNext("Hello");
subject.subscribe(item -> System.out.println("Observer 1: " + item)); // সর্বশেষ আইটেম পায়
subject.onNext("RxJava");
subject.onNext("World");
subject.subscribe(item -> System.out.println("Observer 2: " + item)); // সর্বশেষ আইটেম পায়
}
}
আউটপুট:
Observer 1: Hello
Observer 1: RxJava
Observer 1: World
Observer 2: World
৩. ReplaySubject
- এটি পুরো ডেটা স্ট্রিমকে সংরক্ষণ করে এবং নতুন
Observerএ যোগ দেওয়ার পরে সমস্ত পূর্ববর্তী আইটেম সরবরাহ করে।
কোড উদাহরণ:
import io.reactivex.rxjava3.subjects.ReplaySubject;
public class ReplaySubjectExample {
public static void main(String[] args) {
ReplaySubject<String> subject = ReplaySubject.create();
subject.onNext("Hello");
subject.onNext("RxJava");
subject.subscribe(item -> System.out.println("Observer 1: " + item));
subject.onNext("World");
subject.subscribe(item -> System.out.println("Observer 2: " + item)); // সমস্ত আইটেম পায়
}
}
আউটপুট:
Observer 1: Hello
Observer 1: RxJava
Observer 1: World
Observer 2: Hello
Observer 2: RxJava
Observer 2: World
৪. AsyncSubject
- এটি ডেটা স্ট্রিমের শুধুমাত্র সর্বশেষ আইটেম প্রদান করে, যখন স্ট্রিম সম্পূর্ণ হয়।
onComplete()কল হওয়ার পর এটি ডেটা প্রদান করে।
কোড উদাহরণ:
import io.reactivex.rxjava3.subjects.AsyncSubject;
public class AsyncSubjectExample {
public static void main(String[] args) {
AsyncSubject<String> subject = AsyncSubject.create();
subject.onNext("Hello");
subject.onNext("RxJava");
subject.onNext("World");
subject.subscribe(item -> System.out.println("Observer 1: " + item));
subject.onComplete(); // শেষ ডেটা প্রদান করা হয়
}
}
আউটপুট:
Observer 1: World
৫. UnicastSubject
- এটি একমাত্র একটি
Observerএর জন্য কাজ করে। যদি একাধিকObserverযুক্ত করা হয়, এটি ত্রুটি ছোড়ে।
Subject এর কার্যপ্রণালী
- Observer হিসাবে কাজ করা:
Subjectএর মাধ্যমে ডেটা গ্রহণ করা যায়।- এটি
onNext(),onError(), এবংonComplete()মেথডের মাধ্যমে ডেটা হ্যান্ডেল করে।
- Observable হিসাবে কাজ করা:
- ডেটা স্ট্রিমকে একাধিক
Observerএর মধ্যে বিতরণ করে। subscribe()মেথড ব্যবহার করেObserverযুক্ত করা হয়।
- ডেটা স্ট্রিমকে একাধিক
Subject এর ব্যবহার ক্ষেত্র
- Multicasting Events:
- একাধিক ক্লায়েন্ট বা
Observerকে একই ইভেন্ট পাঠাতে।
- একাধিক ক্লায়েন্ট বা
- Hot Streams:
- ডেটা স্ট্রিম প্রক্রিয়া যেখানে স্ট্রিমের ডেটা সর্বদা পরিবর্তনশীল।
- Manual Data Emission:
onNext()ব্যবহার করে ম্যানুয়ালি ডেটা ইমিট করতে।
সংক্ষেপে
RxJava এর Subject হলো একটি শক্তিশালী টুল, যা Observable এবং Observer উভয়ের মতো আচরণ করে। এটি ডেটা স্ট্রিম শেয়ার করতে, ম্যানুয়ালি ডেটা প্রেরণ করতে, এবং একাধিক সাবস্ক্রাইবারের সাথে যোগাযোগ বজায় রাখতে অপরিহার্য। বিভিন্ন ধরণের Subject এর ব্যবহার নির্ভর করে নির্দিষ্ট সমস্যা সমাধানের উপর।
Read more