ماهي ReactiveX و RxJava وطريقة استخدامها

ماهي الـ ReactiveX

rx

قبل ان نبدأ في شرح المفهوم سأقوم بتوضيح مثال وبعدها نوضح مقالتنا من ناحية تقنية, تخيل انك بالمطار ولديك رحلة لمدينة اخرى ومعك حقيبة تود شحنها للمدينة التي تود الذهاب لها, بكل بساطة ستسلم الحقيبة للموظف الموجود بالمطار وسيقوم الموظف مباشرة بوضع بطاقة تعريفية تحمل معلوماتك ومعلومات الرحلة التي تود الذهاب لها.

بكل تأكيد ان هناك الاف الاشخاص في نفس المطار وكل شخص لديه رقم رحلة مختلف عن رحلتك وربما تشترك انت وشخص اخر بنفس رقم الرحلة ولكن الاختلاف في معلوماتكم الشخصية, بالتالي عندما يأتي شخص اخر ويسلم حقيبته الى الموظف سيقوم الموظف بتكرار نفس الخطوات وسيلصق بطاقة جديدة قد تحمل نفس رقم رحلتك.

جميع هذه الحقائب ستسير في نفس مسار الحقائب ومن خلال كاميرات مثبته على المسارات ستقوم بعمل فحص للبطاقات ومن ثم ستصنف الحقائب بناء على الرحلات وربما تجري بعض العمليات عليها مثل الفحص او التصفية وفي الاخير توجه كل حقيبة الى مسارها الصحيح, هذا بالاضافة الى وجود كاميرات وحساسات على المسارات وتكون تابعة لموظفين في المطار ووظيفة هذه الكاميرات هي تنبيه الموظفين في حالة وجود اي مشكلة في احد المسارات او في حالة تم ايصال جميع الحقائب الى الطائرة الصحيحة.

استوعبت معي المثال السابق؟ اذا لنطبق نفس الفكرة على الـ ReavtiveX .

في الـ ReactiveX لدينا ثلاث مصطلحات مهمة وهي (observables, observers, and subscriptions) وبعض المصطلحات الفرعية ومنها (map and filter) , فالـ observables اعتبرها الحقائب وكل observables يحمل بداخله بيانات تستطيع عمل  filter عليها  بحيث انك تصنفها او تعالجها , ولنعتبر مسار الحقائب هو الـ observer بحيث تمشي عليه جميع الـ observables او بمصطلح اخر لنعتبر الـ observers يحمل بداخله اكثر من observable ولنعتبر الـ Subscribe هو كاميرات المراقبة التي ستراقب الـ observers وتعطيك تنبيه في حالة وجود اي خطأ onError او في حالة انتهت معالج البيانات بشكل صحيحonNext او انتهت المعالجة وبشكل صحيح onCompleted .

ما المقصود بالـ Stream ؟

687474703a2f2f692e696d6775722e636f6d2f634c344d4f73532e706e67-2

تخيل ان الـ Stream مثل الانبوب الذي ينقل بداخله الماء, لايهمك مصدر الماء او من اين اتى او اين سيذهب, كل مايهمك هو ان تنقل الماء من عدة نقاط الى انبوب مركزي واحد ومن ثم يصل الى منزلك, كذلك الـ Data Stream اعتبره مثل الانبوب الذي تنفذ فيه مجموعة اوامر وبيانات و في نفس الوقت (asynchronous) وكل مايهمك هو الناتج.

توجد عبارة جداً جميلة تصف الـ Rx وهي (Reactive programming is programming with asynchronous data streams) وتعني Rx هي طريقة برمجية لتنفيذ ومعالجة اكثر من امر في نفس الوقت.

العمليات الرئيسية مع ReactiveX

Observable

كما ذكرنا سابقاً فإن الـ Observable يحمل بداخله مجموعة بيانات تستطيع تطبيق بعض العمليات عليها وهذه البيانات ربما تكون من web service, Database, file or hardcoded data


Subscribe

وهي لمراقبة الـ Observable ويحمل بداخله ثلاث اوامر او methodes كل واحد تستدعى لامر معين فعلى سبيل المثال onError() في حالة كان هناك اي مشكلة في بعض عمليات الـ Observable او قام الـ Observable بعمل throwing error.

بينما onNext() تستدعى في حالة انتهى الـ Observable من تطبيق العمليات التي نفذتها عليه.

واخيرا onComplete() ويستدعى عند اكتمال جميع العمليات على الـ Observable بشرط انه لايوجد اي خطأ.


Just

Screen Shot 2016-08-07 at 12.21.41 AM

تستخدم لتحويل اي عنصر او Object الى Observable, فمثلا لو كان لديك List بها مجموعة بيانات فتستطيع تحويلها ال Observable باستخدام الكود التالي:

وايضا تستطيع دمج اكثر من List الى Observable واحد وتجري عليه اي عملية تريدها:

اذاً just تقوم بتحويل الـ object الى Observable  بنفس النوع, فمثلا لو لو اسندت List<String> الى Observable باستخدام just  فانها ستنشئ لك Observable<List<String>>


From

Screen Shot 2016-08-07 at 12.26.25 AM

نفس فكرة just ولكن الاختلاف هنا ان From تنشئ لك Observable ولكن تفصله الى وحدات اصغر فمثلاً لو اسندت List<String> الى Observable باستخدام from فانها تفكك عناصر اللست الى Strings  وتصبح الـ  Observable عبارة عن Observable<String<


Filter

Screen Shot 2016-08-07 at 12.11.44 AM

تستخدم في حالة اردت تطبيق Filter معين على كل عناصر الـ Observable, فعلى سبيل المثال لو اردت تصفية البيانات القادمة من قاعدة البيانات واردت فقط بعض البيانات منها


Map

Screen Shot 2016-08-06 at 6.14.52 PM

تستخدم في حالة اردت تنفيذ امر معين على جميع عناصر الـ Observable, فمثلاً لو اردت ضرب جميع عناصر المصفوفة بـ ٣ .


Contains

Screen Shot 2016-08-06 at 6.15.15 PM

تستخدم في حالة اردت البحث في جميع عناصر الـ Observable واردت التاكد من الـ Observable يحمل احد العناصر, فمثلاً لو كان لديك Observable يحمل مجموعة ارقام واردت التاكد من ان الرقم ٢٢ من ضمن قائمة العناصر.


ماهي RxJava

RxJava هي مكتبة او لنقل انها عبارة عن implementation تم كتابته بناء على مفهوم الـReactiveX ومخصص للجافا, اول اصدار لها كان في عام ٢٠١٤ وتحت ترخيص Apache 2.0.

اضافة RxJava لمشروعك

تستطيع تحميل ملف الـ jar من الصفحة الرسمية او اذا كنت تستخدم احد الـ dependency المعروفة فقم باضافتها كالتالي:

Gradle

Maven

Ivy

امثلة على استخدام RxJava

المثال الاول

Screen-Shot-2016-08-07-at-8.51.30-AM

في المثال السابق قمنا بانشاء List تحمل مجموعة قيم ومن ثم اسندناها الى Observable وقمنا بتطبيق بعض العمليات عليها ومنها عمل Filter للـ List واستخراج فقط القيم التي تحمل حرف e وبعد ذلك قمنا بتطبيق عملية على ناتج التصفية وهو تحويل الكلمة الـى Upper Case Charactters ومن ثم قمنا بعمل  Subsscribe للـ Observable وفي onNext وعلى افتراض ان العمليات تنفذت بشكل صحيح قمنا بطباعة الكلمات التي قمنا بتحويلها, وفي onError قمنا بطباعة الخطأ لو حصل خطأ في التطبيق واخيرا ستطبع عبارة Completed سواء كان ناتج التطبيق صحيح او خاطئ.


المثال الثاني

3

في هذا المثال قمنا بتطبيق نفس فكرة المثال السابق ولكن قمنا بدمج two list

 

Leave a Reply