آشنایی با مفاهیم RxJava

در اینجا قصد داریم با بعضی از مفاهیم پایه‌ای Rxjava آشنا شویم و هم چنین مزایای استفاده از آن را بررسی کنیم. Reactive ProgrammingReactive Extensions (RX)RxJava Basicsقبل از وارد شدن به مباحث اصلی بهتر است یک یادآوری درباره بعضی از اصطلاحات کاربردی که در طول متن با آن برخورد می‌کنید داشته باشیممورد اول asynchronous به معنای غیر همزمان هست ؛ هرگاه می‌گوییم یک برنامه یا یک ماژول asynchronous هست به این معناست که هر ماژول کد به روی thread خود اجرا می‌شود (به عبارت ساده‌تر چندین بلوک کد همزمان اجرا می‌شود) و در این روش مقدار زمان انجام تمام کارها معادل انجام طولانی‌ترین کار است. مورد بعد data flows هست؛ در برنامه نویسی واکنشی (reactive programming) به جای داده (data) جریانی از داده (data flows) را داریم. به جریان داده stream هم گفته می‌شود.و هم چنین شایان ذکر هست که Rxjava بر اساس پترن observer ساخته شده و بهتر است برای درک بیشتر مطلب مروری بر این پترن داشته باشید.برنامه نویسی واکنشی (Reactive Programming) برنامه نویسی واکنشی (Reactive programming) اساسا asynchronous( ناهمزمان ) و مبتنی بر رویداد(event-based) است. در این روش ما یک مشاهده‌گر (observer) داریم که هرگاه مقدار متغییری که در نظر داریم تغییر کرد واکنش مطلوب را نشان می‌دهیم.یک مثال از reactive programming:x = y + z;عبارت بالا را در نظر بگیرید در برنامه نویسی واکنشی (reactive programming) وقتی مقدار y یا z به هر دلیلی تغییر کند مقدار x بدون اجرای مجدد x = y + z به روز می‌شود که دلیل این اتفاق هم وجود مشاهده گر (observer ) هست.و Reactive Extensions در واقع Reactive Extensions (Reactive X یا RX)کتابخانه‌ای است که از اصول برنامه نویسی واکنشی(Reactive programming) پیروی می‌کند؛ این کتابخانه‌ها مجموعه‌ای از روش‌ها و رابطه‌هایی را ارایه می‌دهند که به برنامه نویس کمک میکند تا کدی تمیزتر و ساده‌تر داشته باشد.در ادامه RxJava Basics :اساسا Rxjava یک کتابخانه jvm است (یعنی برای اجرا شدن نیاز به java virtual machin دارد.)؛ این کتابخانه به شما امکان می‌دهد که برنامه‌هایی را به سبک برنامه نویسی واکنشی(Reactive programming) ایجاد کنید.مولفه‌های اصلی RxJava شامل observer و observable است. ارتباط بین observable و observer به این صورت است که هنگامی که وضعیت یک observable تغییر می‌کند به تمام ابجکت‌های یک observer اطلاع داده می‌شود.حال قرار داد بین observer و observable به چه صورت است؟۱) observable :در واقع observable یک اینترفیس است که متد اصلی آن()subscribe است که برای درخواست observer استفاده می‌شود.۲) observer :اما observer یک اینترفیس است که شامل سه متد ()onNext و () onComplete و () on Error است. متد ()onNext : این متد زمانی فراخوانی میشود که یک ایتم جدید از سمت observable منتشر می‌شود.متد()onComplete : این متد زمانی فراخوانی میشود که observable تمام موارد را با موفقیت منتشر می‌کند.متد()on Error : این متد زمانی که خطایی رخ میدهد و انتشار داده‌ها با موفقیت کامل انجام نمیشود فراخوانی می‌شود.از دیگر مولفه‌های RxJava میتوان به Operator و Scheduler اشاره کرد.اپراتور( Operator ):در واقع Operators (اپراتورها) به شما این امکان را می‌دهند که داده‌های منتشر شده را دستکاری کنید یا observable جدید ایجاد کنید.اپراتورها انواع مختلی دارند که در اینجا به نحوه کارکرد یکی از اپراتورها بسنده میکنیمMap Operator :نحوه کار این اپراتور به این صورت است که یک stream دریافت میکند و تابع مورد نظر ما را روی stream اعمال می‌کند و نتیجه را به عنوان stream جدید منتشر میکند . مثال زیر را در نظر بگیریدnumbers.map { number -> number * number }بعد از اعمال اپراتور map جریان داده (stream ) عوض میشود و به شکل زیر منتشر می‌شودزمانبند (Scheduler ) :در واقع schedulers یکی از مفاهیم اصلی در RxJava هستند. آنها به ما این امکان را می‌دهند که operator ها را در یک thread جداگانه پردازش کنیم ( به عبارت ساده تر schedulers مسئول انجام operatorها در threadهای جداگانه هستند :) )انواع scheduler هایی که روی operator ها اعمال میشوند شامل موارد زیر هستند IO ComputationNewThreadSingleImmediateTrampolineExecutor SchedulerAndroid Schedulerاما scheduler که روی stream ها اعمال میشوند متفاوت است که فقط دو نوع زیر را شامل می‌شود subscribeOn() روی پردازش upstream تاثیر گذار است۲. observeOn() :روی پردازش downstream تاثیر گذار استبرای توضیح دو مورد بالا با دو اصطلاح upstream و downstream اشنا شوید :در واقع به stream که قبل از اعمال operator منتشر میشود upstream و به stream که بعد از اعمال operator منتشر میشود downstream می‌گویند