یکی از اصلیترین چالشها در پیادهسازی یک نرمافزار قدرتمند به ویژه یک برنامه اندرویدی، این است که با ماهیت پویای تغییر ورودیها روبرو است. مدلهای برنامهنویسی سنتی ناهمزمان(asynchronous) میخواهند برای بروزرسانی این تغییرات به callbackها متکی باشند، اما این روش عواقب منفی دارد. بنابراین RxJava بهعنوان یک کتابخانه محبوب مبتنی بر مفاهیم برنامهنویسی واکنشگرا، این موضوع را به طور موثر و موفقیت آمیز مورد بررسی قرار داده است. این مقاله با هدف بحث در مورد برخی دلایل استفاده از RxJava در اندروید به منظور افزاریش کارایی و بهرهوری ایجاد شده است.
RxJava و برنامه نویسی واکنش گرا چیست؟
در اصل، RxJava یک کتابخانه برای ساختن جریانهای دادهای ناهمزمان و برنامههای مبتنی بر رویداد با استفاده از توالیهای قابل مشاهده در یک سبک برنامه نویسی واکنشگرا است.
در برنامه نویسی واکنش گرا مصرف کنندهها هنگام ورود داده به آن واکنش نشان میدهند. به همین دلیل است که برنامه نویسی ناهمزمان را برنامه نویسی واکنش گرا نیز مینامند. اساساً برنامه نویسی واکنش گرا اجازه میدهد تا تغییرات در رویداد را برای ناظران خود منتشر کنند. بهعنوان مثال در این معادله: X = Y + Z وقتی میخواهیم مقدار X یا Y را تغییر دهیم، مقدار X به طور خودکار تغییر خواهد کرد. این تغییر را میتوان با مشاهده همزمان مقادیر Z و Y انجام داد.
سرانجام RxJava، پیادهسازی مفهوم برنامه نویسی واکنش گرا برای واکنش به تغییرات در برنامههای اندرویدی است.
RxJava چگونه کار میکند؟
در واقع RxJava، الگوی طراحی نرمافزار Observer را گسترش میدهد که مبتنی بر ناظران(Observers) و مشاهدات(Observables) است. اگر میخواهید با کتابخانه RxJava کارکنید، برخی مفاهیم را مشاهده خواهید کرد که نقش اساسی در پیادهسازی آن دارد. بنابراین درک این مفاهیم ضروری است. که در زیر به اختصار ذکر شدهاند:
Observable
Observable کلاسی است که جریانی از دادهها یا رویدادها را منتشر میکند.
Observer
Observer طرف مقابل Observable است. در واقع این کلاس است که رویدادها را دریافت میکند و به آن واکنش نشان میدهد.
Subscriber
Subscriber پلی بین مشاهدات و ناظران است. همچنین ممکن است چندین ناظر در یک Subscriber وجود داشته باشند.
Operators
اپراتورها در RxJava به شما امکان میدهد که دادههای منتشر شده توسط Observable را دستکاری کنید، اصولا عملگرها عملیاتی هستند که به ما امکان میدهند تا قبل از مصرف دادهها را تغییر دهیم مانند just, map, from و غیره.
Scheduler
Scheduler یک عنصر مهم در RxJava است، که به ناظر و مشاهدات میگوید روی کدام thread شروع شوند. بهطور خلاصه همزمانی را مدیریت میکند.
علاوه بر این، در اصل سه نوع رویداد وجود دارد که ناظر شما میتواند دریافت کند که به شرح زیر است:
- onNext(): این متد زمانی فراخوانی میشود که آیتم جدید توسط Observable منتشر شود
- onError(): این متد زمانی که خطایی رخ دهد و یا انتشار اطلاعات موفقیتآمیز نباشد فراخوانی میشود
- onComplete(): این متد زمانی فراخوانی میشود که ناظر با موفقیت همه آیتمها را منتشر کند
چند مرحله ساده برای ایجاد RxJava
در کل برای پیادهسازی مفاهیم RxJava شما باید حداقل مراحل زیر را انجام دهید:
- ایجاد مشاهدات(Observable)
- ارائه داده به Observable برای انتشار
- ایجاد یک ناظر
- Subscribe کردن ناظر در مشاهدات
برای مثال:
Observable.just("x", "y", "z").subscribe(new Observer<String>() {
@Override
public void onNext(String s){System.out.println("onNext: " + s); }
@Override
public void onCompleted() { System.out.println("Completed!"); }
@Override
public void onError(Throwable e) {... }
});
مزایای استفاده از RxJava
-
داشتن برنامه واکنشگرا
کتابخانه RxJava به گونهای طراحی شده است که طیف گستردهای از دادهها و رویدادها را به صورت همزمان کنترل میکند. این بدان معنی است که میتواند بلافاصله انجام برخی کارها مانند فراخوانی چندین وب سرویس در پسزمینه، مدیریت خطا و کنترل view را بدون کاهش پاسخگویی برنامه اندروید انجام دهد.
-
انجام آسان Threadبندی و multi-threading
اصولا اگرچه RxJava به صورت پیشفرض single-thread است، اما میتواند مدلهای زیادی برای thread بندی، هم برای کارهای پسزمینه و هم callbackها ارائه دهد. همچنین برای انجام کارهای ناهمزمان، مدیریت thread بسیار ضروری است. در بسیاری از شرایط هنگامی که یک کار انجام میشود، ما با ارتباط بین thread پسزمینه و thread اصلی روبرو میشویم. بهعنوان مثال بروزرسانی Ui هنگامی که thread پسزمینه در حال اجرا است. بنابراین در این شرایط قبل از بروزرسانی Ui نیاز به بررسی تعدادی مورد است. با این حال RxJava با استفاده از برخی از اپراتورها و زمانبندها (Scheduler) کارایی برنامههای multi-threading و همزمان را آسان میکند.
-
حل مشکل Callback Hell
روشهای سنتی برنامه نویسی ناهمزمان تمایل دارند برای بروزرسانی تغییرات ورودی به callbackها متکی باشند، اما این روش میتواند باعث بروز مشکلی شود که بهعنوان callback hell معروف است. این مشکل شامل چندین callback تو در تو است، که خواندن و debug کردن کد را سخت میکند. بنابراین یکی از نتایج استفاده از RxJava در واقع حل مشکل callback hell است.
-
انعطافپذیری بالاتر
در اصل RxJava از تعداد زیادی اپراتور استفاده میکند، که میتواند برروی دادهها اعمال شود. یعنی که اپراتورها میتوانند روی دادههایی که توسط Observable با عملکردها و رفتارهای مختلف منتشر میشوند تاثیر بگذارند. در نتیجه تعداد زیادی از اپراتورها میتوانند انعطافپذیری شما را برای پیادهسازی آسانتر نیازهای برنامه افزایش دهند.
-
داشتن مکانیسمی برای مدیریت خطا
AsyncTask اغلب دارای برخی اشتباهات است، که در thread پسزمینه رخ میدهد، و شناسایی آنها در روند بروزرسانی Ui thread با استفاده از متد PostExecute() دشوار است. با این حال RxJava مکانیسم روشنی برای رسیدگی به خطاها دارد. در یک جریان واکنشی عناصر ابتدا با استفاده از متد onNext() مصرف میشود، و پس از اتمام جریان داده متد onComplete() فراخوانی میشود. اگر در متد onNext() با خطایی مواجه شوید، کنترل به متد onError() تغییر میکند. علاوه بر این وقتی میخواهید از اپراتورهای RxJava مانند Map یا FlatMap استفاده کنید، متدهای دیگری برای کنترل خطا وجود دارد. برای مثال:OnErrorReturn, OnResumeNext, OnExceptionResumeNext و غیره.
-
مدیریت چرخه زندگی
هنگام توسعه اندروید در برخی موارد وظیفهای که در پسزمینه انجام میشود زنده است، اما اکتیویتی یا فرگمنت شما که به آن متصل هستید از بین رفته است. بنابراین برای جلوگیری از این موارد در چرخه زندگی اندروید، RxJava برخی از بهترین روشها مانند استفاده از کتابخانه RxLifecycle ارائه میدهد.
-
ارائه یک workflow استاندارد برای کدزدن
RxJava یک workflow استاندارد را ارئه میدهد که برای مدیریت کلیه دادهها و رویدادها در برنامه مانند: ایجاد Observable > ارائه داده به Observable برای انتشار > subscribe کردن ناظر به مشاهدات است.
بنابراین به این معنی است که این workflow میتواند راهنمایی برای نوشتن کدهای تمیز به شما ارائه دهد. در نتیجه بهرهوری و خوانایی کدها در مقایسه با روشهای سنتی میتواند افزایش یابد.
-
ادغام با سایر کتابخانهها
RxJava روز به روز محبوبتر میشود، خصوصاً برای توسعهدهندگان اندروید. بنابراین تعدادی کتابخانه برای ادغام با آن مانند Retrofit وجود دارد.
نتیجه
RxJava بهعنوان یک کتابخانه برجسته به ویژه در توسعه برنامههای اندروید، مسئله ماهیت پویای ورودیهای برنامه نویسی را در مقایسه با روشهای سنتی به طور موثرتر و به صورت موفقیتآمیز مورد بررسی قرار داده است. این مقاله سعی داشت برخی از مزایای استفاده از RxJava در توسعه اندروید را نشان دهد.
دیدگاه و پرسش
در حال دریافت نظرات از سرور، لطفا منتظر بمانید
در حال دریافت نظرات از سرور، لطفا منتظر بمانید