آموزش Subject در RXJava 2

این مقاله در مورد Subject های در RXJAVA 2 هست ، که کاربرد های بسیار زیادی داره، البته شکل های دکیومنتیشن اصلی RXJava 2 در مورد این موضوع یکم عجیب و گیج کننده هست بنابراین از اونا استفاده نکردم ، در این پست سعی شده که با مثال توضیح داده بشه، که در پست های بعدی بعضی از کاربرد های اونا رو معرفی می کنم، Subject شامل انواع زیر هست :

  • Publish Subject
  • Replay Subject
  • Behavior Subject
  • Async Subject

پیش نیاز این آموزش اینه که به طور مقدماتی با RXJava 2 آشنایی داشته باشین. تعریف رسمیش اینطوریه :

یک Subject یک نوع پل یا پراکسی هست که در بعضی از پیاده سازی های ReactiveX قابل دسترس هست و هم به عنوان یک observer و هم به عنوان یک Observable عمل می کنه. به خاطر observer بودن ، می تونه یک Observable یا بیشتر از یکی رو Subscribe کنه و همینطور به خاطر این که یک Observable هست می تونه با re-emit کردن از طریق آیتم هایی که observe می کنند فرستاده بشه، همینطور می تونه آیتم های جدیدی رو emit کنه.

به نظر من یاد گرفتن با مثال بهترین، راه یادگیری هست، پس سعی می کنم با مثال براتون توضیح بدم:

  • فرض کنید که یک استاد یک Observable هست. استاد در مورد موضوعی تدریس می کنه
  • بعد این که فرض کنید Observer یک دانشجو هست. دانشجو به موضوعاتی که استاد تدریس گوش می کنه یا به قولی Observe می کنه.

حالا یکی یکی براتون با مثال توضیح میدم :

Publish Subject

کارش اینه که همه ی آیتم های بعدی سورس Observable رو موقع Subscription ، منتشر ( emit ) کنه.

حالا فرض کنید یک دانشجویی دیر وارد کلاس شده، از همون موقعی که وارد کلاس شده شروع می کنه به گوش کردن به درس. به این نوع دریافت داده ها publish می گن.

مثال پایینی رو نگاه کنید:

PublishSubject<Integer> source = PublishSubject.create();

// It will get 1, 2, 3, 4 and onComplete
source.subscribe(getFirstObserver()); 

source.onNext(1);
source.onNext(2);
source.onNext(3);

// It will get 4 and onComplete for second observer also.
source.subscribe(getSecondObserver());

source.onNext(4);
source.onComplete();

Replay Subject

مهم نیست که چه وقتی Subscriber بخواد Subscribe کنه، همه ی آیتم های سورس Observable رو emit ( منتشر ) می کنه.

حالا فرض کنید یه دانشجو دیر وارد کلاس بشه، دانشجو نه فقط از موقعی که وارد کلاس شده شروع به گوش کردن میکنه بلکه شروع می کنه به پرس و جو در این مورد که از اول کلاس استاد چی گفته، برای استفاده ی شبیه به این کاربرد از Replay استفاده میشه.

مثال زیر رو نگاه کنید:

ReplaySubject<Integer> source = ReplaySubject.create();

// It will get 1, 2, 3, 4
source.subscribe(getFirstObserver());

source.onNext(1);
source.onNext(2);
source.onNext(3);
source.onNext(4);
source.onComplete();

// It will also get 1, 2, 3, 4 as we have used replay Subject
source.subscribe(getSecondObserver());


Behavior Subject

این عملگر آخرین آیتم ماقبل emit و همه ی آیتم هایی که بعد Observe شدن Observable توسط Observer میان رو emit می کنه.

فرض کنید یک دانشجو دیر وارد کلاس بشه و علاوه بر اینکه از موقعی که وارد کلاس شده شروع به گوش دادن می کنه، از هم کلاسیش میپرسه که آخرین چیزی که قبل وارد شدنش ، استاد گفت ، چی بوده؟

مثال پایین رو ببینید :

BehaviorSubject<Integer> source = BehaviorSubject.create();

// It will get 1, 2, 3, 4 and onComplete
source.subscribe(getFirstObserver());

source.onNext(1);
source.onNext(2);
source.onNext(3);

// It will get 3(last emitted)and 4(subsequent item) and onComplete
source.subscribe(getSecondObserver());

source.onNext(4);
source.onComplete();

Async Subject

این عملگر آخرین آیتم observe شده که بعد از Subscribe میاد رو emit می کنه.

حالا یه مثال دیگه، فرض کنید همون دانشجو دیر وارد کلاس بشه و دنبال این باشه که وقتی کلاس تموم شد به آخرین چیزی که استاد بعد کلاس میگه گوش بده، اینجا ما از عملگر Async استفاده می کنیم.

مثال پایین رو ببینید :

AsyncSubject<Integer> source = AsyncSubject.create();

// It will get only 4 and onComplete
source.subscribe(getFirstObserver());

source.onNext(1);
source.onNext(2);
source.onNext(3);

// It will also get only get 4 and onComplete
source.subscribe(getSecondObserver());

source.onNext(4);
source.onComplete();

امیدوارم خوب منظور نویسنده رو رسونده باشم :) .

E-mail : sdyussuf@gmail.com

Telegram : @yousefnia75

منبع