برمجة الأندرويد

درس مكتبة EventBus : الإتصال بين مكونات التطبيق بسهولة

[mhc_section admin_label=”section”][mhc_row admin_label=”row”][mhc_column type=”4_4″][mhc_post_header admin_label=”عنوان المقالة” title=”on” meta=”off” avatar=”on” author=”on” date=”on” categories=”on” comments=”off” views=”off” text_orientation=”right” text_color=”dark” featured_image=”on” featured_placement=”above” parallax=”on” parallax_method=”off” animation=”off” custom_paddings=”40″ size=”30px” title_bold=”on” text_shadow=”off” text_background=”off” text_bg_color=”#ffffff” overlay=”on” saved_tabs=”all”] [/mhc_post_header][mhc_text admin_label=”اف” background_layout=”light” text_orientation=”right”]

يعد تبادل البيانات بين كلاس وأخر فى الأندرويد أمر شائع فتحتاج أحيانا لإرسال بيانات من الفريجمنت للأكتيفيتى أو من الأكتييتفى للفريجمنت أو من الأكتيتيفى للسيرفس أو العكس لاغراض مختلفة ومتعددة ورغم توفر عدة طرق تمكنك فعل ذلك مثل الـ Intent والـ Interface وغيرها من الطرق الا أن المكتبة التى سنتحدث عنها اليوم ستجعل من عملية الاتصال بين الكلاسات المختلفة أمر سهل جدا حيث ستقوم بكتابة أسطر كود قليلة جدا تحقق الغرض الذى تريده وتوفر عليك الوقت والمجهود .

 

EventBus 

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

 

إضافة EventBus للمشروع 

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

compile 'org.greenrobot:eventbus:3.0.0'

ونقوم بعمل Synce   أو Compile  

 

 

كيف تعمل EventBus 

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

 

مثال عملى  على استخدام EventBus  

سوف أقوم بإنشاء 2 فريجمنت أحدهما به زر والاخر به نص  واضافتهم فى نفس الأكتيتيفى كالتالى :

اذا قمت الان بتشغيل التطبيق وضغط على الزر لن يحدث أى شىء باالتأكيد وما نريد أن نفعله أن نتصل بالفريجمنت الثانى ليقوم بزيادة العدد 0 الى 1 وكلما ضغطنا يتصل به الان موضوع ضغط الزر هو عباره عن حدث Event وأى حدث نريد ان نقوم بمعالجته من خلال EventBus نقوم بإنشاء كلاس له

سوف نقوم بإنشاء كلاس اسمها AddButtonClicked  كالتالى :

كلاس فارغة تماما

الان سنذهب للفريجمنت الأول الذى نريد نقل الحدث منه وهو الان كالتالى مجرد فريجمنت عادى به زر add

نبدأ بعمل ميثود الضغطط على الزر ونكتب كود EventBus  بداخلها كالتالى :

سطر واحد فقط ! عند الضغط فقط استخدمنا فيه الميثود post ثم اعطيناها new AddButtonClicked ويكأننا نأمر EventBus بأن تنقل حدث جديد وهو عباره عن AddButtonClicked .

انتهى العمل فى الفريجمنت الأول وتعمل EventBus طبقا لأسلوب الـ publisher /subscriber بمعنى ان هناك من يرسل حدث وهناك من يشترك فى هذا الحدث ويستمع له وينفذه لذللك يمكننا استقبال نتيجة حدث الضغط على الزر هذا فى اى اكتييتفى او سيرفس او فريجمنت اخر وليس بالضرورة فريجمنت 2 كما سنفعل الان انما هذا مجرد مثال فقط .

 

نذهب الى الـ fragment 2 وهذا هو محتواه الان قبل ان نبدأ بفعل شىء

الان نريد أن نعلم الـ EventBus أن هذا الكلاس يهمه الأمر أو هذا الفريجمنت سيستقبل حدث من الأحداث ويتم ذلك عن طريق تسجيل هذا الفريجمنت عند بدءه وكذلك ايقاف تسجيله عند توقفه وبالتالى طالما هذا الفريجمنت ظاهر فهو سيستقبل الاحداث من EventBus لاحظ ما فعلناه فى الميثود onStart() والميثود onStop()

 

الان تبقى شىء وحيد الان هذا الفريجمنت fragment2 سيستقبل الأحداث من EventBus لكن ماذا سيفعل ؟ وأى حدث سيقوم بمعالجته ؟ لذلك نقوم بعمل ميثود يسبقها Annotation Subscribe وتأخذ الـ Event الخاص بنا كباراميتر كالتالى :

تجد قبل الميثود فى سطر الـ Annotaion قمنا بعمل @Subscribe وبداخل القوس حددنا الـ Thread حيث تعمل الEvent Bus مع الـ Threads المختلفة ولأننا نعمل حاليا ونريد ان يتم تنفيذ هذا الأكشن فى الـ MainThred اعطيناه الـ threadMode = ThreadMode.Main تحته مباشرة قمنا بعمل ميثود public void واعطيناها اسم وباراميتر نوعه الكلاس التى أنشأناها سابقا AddButtonClicked وبداخل الميثود نفعل ما نريد والحرية لك فى كتابة الكود الذى تريده حدوث الحدث وهنا قمت بجلب الرقم الموجود فى الـ Text View وحذف الـ % لأقوم بزيادة رقم عليه وزدت الرقم ثم وضعته مرة أخرى .

 

قم الان بتشغيل التطبيق وشاهد النتيجة ستجد عند الضغط على الزر يتم زيادة النسبة المئوية بمقدار 1

 

 

جميل نجحنا الان فى الاتصال بين 2 فريجمنت وبنفس الطريقة السابقة يمكنك تنفيذها فى اى كلاس اخر اكتييتفى او سيرفس كما تريد .

 

 

نقل البيانات عبر EventBus  

يمكننا ليس فقط اجراء اتصال لكن يمكننا ايضا ارسال بيانات فلنفترض اننا فى موقف اخر ونريد جعل الموضوع اكثر مرونة والسماح للمستخدم بادخال قيمة الزيادة التى يريدها لذلك سأقوم بتعديل سريع على الفريجمنت الأول واضافة EditText  ليكون كالتالى :

الان نريد ارسال القيمة ضمن الحدث فى الـ EventBus لذلك سنذهب لكلاس الحدث AddButtonClicked والان اريد نقل قيمة عباره عن int لذلك ساقوم باضافتها فى كلاس الحدث وقم بإنشاء الكونستراكتور وكذلك الـ Getter و الـ Setters كالتالى :

 

الان نذهب للفريجمنت 1 لنراجع ما يحدث عند الضغط على الزر ونعدل الكود

قمنا بجعله يرسل قيمة النص الموجود فى الـ EditText

 

نذهب للفريجمنت 2 وقت استقبال الحدث  نقوم بالتغيير الازم كالتالى

نقوم الان بتشغيل التطبيق ونقوم بادخال رقم فى ال edit text وسوف يتم اضافته للنسبة المئوية

وبذلك نجحنا فى الاتصال بين الفريجمنتس ونقل البيانات بينهمها باستخدام Event Bus .

طبعا هذا مجرد مثال بسيط على استخدام المكتبة وكما ذكرت سابقا يمكنك استخدامها مع امور اخرى وليس فقط اتنين فريجمنتس وتبادل البيانات بكل بساطة وبسرعة اذا كان لديك اى اسئلة أو استفسارات قم بطرحها فى جروب المطورين Hendiware Developers 

 

 

 

[/mhc_text][mhc_comments admin_label=”تعليقات” show_comments=”on” /][/mhc_column][/mhc_row][/mhc_section]
السابق
Google Maps بالعربية – الدرس الثالث
التالي
درس Data Binding Library

9 تعليقات

أضف تعليقا

  1. mohammed قال:

    طيب لو عايز انقل الحدث من اكتيفتى لكلاس معين فيه ادابتر مثلا
    هل اقدر اعمل كدا ؟
    كدا مش هيبقى فيه onStart و onStop

    1. Hendiware قال:

      هو غالبا بتحتاج تنقل احداث للأدابتر علشان تحدث item فيه مثلا او تعدل item معينة والأدابتر موفرلك كده كده مجموعة ميثود notify…. تقدر تنفذ ده منهم لكن لو لغرض اخر ممكن تستخدمها برضو
      الـ Adapter بيتبع نفس سياق (ِContext) الأكتيتيفى أو الفريجمنت المتواجد بيه ممكن فى onStart او onCreate تعمل EventBus.getDefault().register(yourAdapterObject) وبداخل ميثود onStop او Destroy الخاصة بالأكتييتفى EventBus.getDefault().unregister(this);

      1. mohammed قال:

        تمام
        شكرا جدا لمجهودك

  2. Ismail Abozeed قال:

    مجهود رائع يا هندي تسلم ايدك وربنا يجعلوا في ميزان حسناتك

    1. Hendiware قال:

      نورت التدوينة يا اسماعيل .. شكرا ليك.

  3. Abed قال:

    رائع جدا
    ولو عاوز اعمل tablet ينفع استخدمها …؟ و ازاي ؟؟ولو نفس Example

    1. Hendiware قال:

      بالتأكيد يمكن استخدامها فى اى موقف برمجى بشرط تراعى فلسفتها على المستقبل للحدث ان يقوم بعمل regsiter و unregister . والمرسل تقوم من خلاله بعمل post . جرب ولو واجهتك اى مشكلة أخبرنى.

      1. Abed قال:

        اسف لقد وجدت صعوبه في عمل تطبيق للtablet ممكن تساعدني في عمل ولو ميثال صغير

  4. طراد الحريري قال:

    جزاكم الله خيرا

اترك تعليقاً

This site uses Akismet to reduce spam. Learn how your comment data is processed.