آموزش RxJava یا برنامه نویسی reactive در اندروید

در این مقاله قصد دارم به آموزش استفاده از RxJava یا همون برنامه نویسی reactive در اندروید بپردازم. اگه با بحث الگوهای طراحی در مهندسی نرم افزار آشنایی داشته باشید میدونید که یه الگویی به اسم Observer داریم. پایه فهم RxJava یا همون برنامه نویسی reactive در اندروید فهمیدن الگوی طراحی Observer هست. پس از خواندن این مقاله شما میتونید جواب سوال های زیر رو بدونید.

  • مفهوم الگوی طراحی Observer چیست؟
  • برنامه نویسی Reactive در اندروید چیست و چرا باید ازش استفاده کنیم؟
  • کتابخانه های RxJava و RxAndroid  چه کتابخانه هایی هستند؟
  • مفاهیم کلیدی هنگام استفاده از RxJava چه چیزهایی هستند؟

مفهوم الگوی طراحی Observer

برای درک مفهوم الگوی طراحی observer یک مثال میزنم. فرض کنید شما از مطالب یک وب سایت خیلی خوشتون میاد و دوست دارید هر وقت مطلب جدیدی توی سایت دلخواهتون منتشر میشه سریع بخونیدش. یک راه این هست که حواستون باشه هر چند وقت یکبار به سایت دلخواهتون سر بزنید تا مطالبش رو از دست ندید ولی راه خوبش این هست که شما توی خبرنامه سایت subscribe کنید، مثلا ایمیلتون رو در خبرنامه وارد کنید تا هر وقت مطلب جدیدی اضافه شد براتون ایمیل فرستاده بشه و خبر دار بشید. حالت دوم در واقع همون الگوی طراحی Observer است :-).

به سایت مبدا Observable یا Publisher میگیم و به شما که subscribe کردید تا هر وقت مطلب جدید اومد مطلع بشید Observer یا Subscriber میگیم. حالا در دنیای برنامه نویسی Observable و Observer هر دو کلاسهایی هستند که ازشون Object ساخته میشه. یک کلاس Observable دیتا رو منتشر (Publish) میکنه و یک کلاس Observer دیتای منتشر شده توسط کلاس Observable رو میگیره و یه کاری باهاشون انجام میده. فقط این نکته مهم رو حواستون باشه که کلاس Observer تا وقتی برای دریافت دیتا از کلاس Observable ساباسکرایب(Subscribe) نکرده باشه دیتایی رو دریافت نمیکنه.

برنامه نویسی Reactive در اندروید چیست؟

وقتی گفته میشود که در اندروید از برنامه نویسی Reactive استفاده کردیم منظور این هست که برای کارهای مختلف  Observable ها و Observer ها رو به کار بردیم. مثلا فرض کنید قراره یک سری دیتا رو در RecyclerView نمایش بدیم برای اینکار اگه بخوایم از برنامه نویسی Reactive استفاده کنیم میتونیم یک Observable داشته باشیم که دیتای مورد نظر ما رو Publish کنه و یک Observer داشته باشیم که دیتای منتشر شده رو بگیره و در RecyclerView نمایش بده. همانطور که قبلا اشاره کردم Observer با دیتایی که میگیره یک کاری انجام میده مثلا توی این مثال دیتا رو در RecyclerView نمایش میده، ممکنه در جای دیگه دیتایی رو که گرفته توی دیتابیس ذخیره کنه و یا هر کار دیگه ای رو با دیتایی که میگیره انجام بده.

یک Observable میتواند هر تعداد Observer یا Subscriber داشته باشد. هر وقت Observable یک آیتم دیتای جدید رو منتشر کنه متد OnNext هر کدام از Subscriber ها فراخوانی میشود. هر وقت Observable کار انتشار کل دیتای مورد نظرش رو به طور موفق انجام بدهد متد OnComplete هر کدام از Subscriber ها فراخوانی میشود. هر وقت Observable موقع انتشار دیتای خود با مشکل مواجه شود متد OnError هر کدام از Subscriber ها فراخوانی میشود.

چرا Reactive ؟

استفاده از برنامه نویسی Reactive در اندروید مزایای زیادی داره، باعث میشه برای کارهای پیچیده کد کمتری بنویسید و در نتیجه خوانایی کدهاتون افزایش پیدا میکنه و همین امر باعث میشه که دیباگ برنامه و پیدا کردن خطا راحت تر انجام بشه. علاوه بر این موارد، موقعی که در برنامه هاتون از Multithreading استفاده میکنید(همه اپ ها جز موقعی که میخواید چند تا کد تستی بنویسید از Multithreading استفاده میکنن) کارتون خیلی راحت میشه. برای مثال شما میتوانید بگید که Observable دیتای خود را در ترد بک گراند تولید کنه و Observer در ترد main دیتا را دریافت کرده و از آنها استفاده کند.

کتابخانه های RxJava و RxAndroid

RxJava کتابخانه ای است که برنامه نویسی Reactive رو برای زبان جاوا فراهم میکند. در ادامه این مقاله با کلاس های موجود در این کتابخانه بیشتر آشنا میشویم. در کتابخانه RxAndroid یک کلاسی به اسم AndroidSchedulers وجود دارد که موقع استفاده از RxJava در بستر Multithrading به ما کمک میکند.

مفاهیم کلیدی هنگام استفاده از RxJava

هنگام استفاده از برنامه نویسی Reactive در اندروید اگه یک سری از مفاهیم رو از همون ابتدا خوب یاد بگیریم کارمون خیلی راحت میشه که بنده در ادامه به اونها میپردازم.

  • Observable که بهش Publisher هم میگویند. در مطالب قبلی به این مفهوم پرداختم فقط اینجا بگم که Observable های مختلفی در Rxjava وجود دارد که میتونیم ازشون استفاده کنیم. یک نوع اسمش همون Observable هست که صفر تا N تا آیتم دیتا رو منتشر میکنه و در نهایت یا به طور کامل کارش انجام میشه و successfull میشه یا اینکه با خطا مواجه میشه. یک نوع دیگه اسمش Single هست. این نوع از Observable بر عکس قبلی آیتم دیتا منتشر نمیکند بلکه کلا دو حالت داره یا موفق میشه و متد onSuccess هر کدام از Subscriber هایش را فراخوانی میکند و یا اینکه با خطا مواجه میشود و متد onError هر کدام از Subscriber هایش را فراخوانی میکند. نوع های دیگری هم وجود دارند که ترجیح میدم تو سایت کم کم یک سری مثال ازشون بزارم و تو کد توضیح بدم تا اینکه بخوام اینجا بنویسم.
  • Observer که بهش Subscriber هم میگویند و در مطالب قبلی دربارش صحبت کردم.
  • Schedulers : همانطور که گفتیم RxJava موقعی که بخواهیم از Multithreading در برناممون استفاده کنیم کارمون رو راحت میکنه و میتونیم به جای AsynchTask از RxJava استفاده کنیم که این امر با استفاده از Schedulers ها میسر میشه. دو تا متد مهم که موقع استفاده از RxJava بهشون Schedulers پاس میدیم یکی SubscribeOn هست و دیگری ObserveOn. متد SubscribeOn تعیین میکنه که کار Observable در کدام ترد انجام بشه و متد ObserveOn تعیین میکنه که کار Observer در کدام ترد انجام بشه. بیشتر از Schedulers.io برای SubscribeOn استفاده میکنیم مخصوصا موقعی که کار Observable برای تولید دیتا یک کار زمانبر هست. دقت کنید این که میگم Observable تولید دیتا میکنه همیشه درست نیست و فقط برای بعضی از انواع Observable ها صحیح است زیرا همانطور که قبلا گفتم ممکنه Observable ای که استفاده میکنیم از نوع Single باشه و یک کار زمانبری رو انجام بده ولی در نهایت فقط بگه که موفق انجام دادم یا نه. بیشتر از AndroidSchedulers.io برای ObserveOn استفاده میکنیم که میگه کار Observer در ترد main انجام بشه
  • Operators : اپراتورها یه تابع هایی هستند که روی Observable ها اعمال میشن و خروجی آنها رو تحت تاثیر قرار میدن. مثلا شما میتوانید با استفاده از Operator ها خروجی Observable رو فیلتر کنید تا آن آیتم هایی که شرایط خاصی دارند منتشر بشن یا اینکه مثلا یه تغییر خاصی روی آیتم های Observable بدید و بعد منتشرشون کنید.
  • Subject یک چیزی شبیه Observable هست با یه تفاوتهایی. تفاوت Observable با Subject این هست که تا زمانی که یک Observer برای دریافت دیتا از Observable مشترک نشه دیتایی توسط Observable منتشر نمیشه حتی اگر Observable انتشار دیتا رو شروع کرده باشه ولی در Subject اینطوری نیست، یعنی حتی اگر Observer ای برای دریافت دیتا مشترک نشده باشه و Subject کار انتشار دیتا رو شروع کرده باشه دیتاها منتشر میشن حالا بسته به نوع Subject یا دیتا هدر میره یا اینکه وقتی Observer ای برای دربافت دیتا مشترک شد دوباره از اول منتشر میشن. در RxJava انواع مختلفی Subject داریم که یه توضیح مختصری برای هر کدوم مینویسم ولی حتما در آینده مثال ازشون روی سایت قرار میدم:
    • PublishSubject : این نوع Subject وقتی انتشار دیتا رو شروع کرد هر جا که یک Observer ای برای دریافت دیتا مشترک بشه از همون نقطه به بعد دیتا رو دریافت میکنه یعنی در واقع دیتای قبل از مشترک شدنش رو دریافت نمیکنه
    • ReplaySubject : این نوع Subject همانطور که از اسمش یکم مشخص هست عمل replay رو انجام میده. یعنی هر Observer هر جا که مشترک بشه مهم نیست Subject از اول دیتا رو بهش میده.
    • BehaviorSubject : این نوع Subject تقریبا شبیه PublishSubject هست ولی با این تفاوت که وقتی یک Observer ای برای دریافت دیتا مشترک میشه از همان نقطه به بعد دیتا رو بهش میده به علاوه یک دیتا قبل از زمان مشترک شدنش(همین یک دیتا باعث تفاوتش با PublishSubject شده)
    • AsyncSubject : این نوع Subject خیلی جالبه چون براش مهم نیست کی چه زمانی برای دریافت دیتا مشترک میشه هر زمان که مشترک شده باشه فقط آیتم آخر رو در اختیارشون قرار میده.

 

 

 

درباره نویسنده

پست های مرتبط

12 نظر

  1. محمد رجبی

    سلام
    اموزش خیلی خیلی خوبی بود اولین جایی که rx رو ساده و کاربردی توضیح داده بود امیدوارم بازم ازش اموزش های بیشتری بذارید من که دیگه observer اینجا شدم 🙂

    پاسخ
    1. فهیمه قاسمی
      فهیمه قاسمی

      شما معلومه خیلی خوب مفهوم rxjava رو متوجه شدید 🙂 من تقریبا هر روز یه سری نکات کوتاه کاربردی در رابطه با برنامه نویسی اندروید در کانال تلگرام (codeintouch) منتشر میکنم میتونید اونجا هم عضو بشید. از سری مقالات rxjava مقاله multithreading در rxjava را هم منتشر کردم که میتوانید مطالعه کنید.

      پاسخ
  2. نوشین

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

    پاسخ

پاسخ

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

12 − 2 =