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

الـ MultiThreading بالعربية – الدرس الثانى

تحدثنا فى الدرس السابق الـ MultiThreading بالعربية – الدرس الأول عن كيفية انشاء ثريد وكيفية تعامل النظام مع الThreads اثناء التنفيذ بشكل سريع وأن الكود الذى سيتم تنفيذه يوضع داخل الميثود run .

يمكن ايضا انشاء كائن Runnable وتمريره الى الـ Thread بدلا من عمل override مباشرة والـ Runnable هو عباره عن Interface به ميثود واحده وهى run ايضا حيث يتم تمريرها للثريد ويقوم بتنفيذ ما بداخلها وهذا مثال عليها

 

حيث يعتبر الـ Runnable كـ Task ويتم تمريره الى الـ Thread ويقوم الـ Thread بتنفيذه

 

لا يمكن تعديل العناصر الموجودة بالواجهه الا عبر الـ MainThread  وبالتالى فى حالة انك مثلا تقوم بعملية معينه داخل الـ Thread وتريد اجراء عملية ستتم فى واجهة المستخدم كـ setText لـ TextView معين أو اى عنصر اخر تريد التعديل عليه فلا يمكنك فعل ذلك مباشرة من خلال اى ثريد سوى الـ Main هيا بنا نجرب

 

وستجد رسالة رائعة باللون الاحمر فى الـ Logcat تخبرك بأن الـ Thread الذى انشىء الـ View (المقصود به هنا الـ MainThread) هو فقط من له الصلاحية للوصول والتعديل على مكونات الـ UI  ولذلك اذا كنا داخل ثريد اخر غير الـ MainThread فيجب علينا ارسال ما نريد فعله فى رسالة الى الـ MainThread ونجعله يقوم بالتنفيذ ويمكننا ذلك باستخدام runOnUiThread او عن طريق الـ Handler ويعتبر الاثنين يقومان بمهمة تعرف بارسال الـ task الى الـ Message Queue الخاص بالـ MainThread وبالتالى يتم تنفيذها بواسطة الـ Looper  ولا تقلق سنقوم بايضاح كل شىء عن هذه المصطلحات  بعد قليل  .

 

 

سوف نقوم بالتعمق فى الـ Thread  والقاء نظرة اقرب عليه

فى الدرس السابق تحدثنا عن الـ Process وأنها عندما تبدا تحتوى على الـ MainThread  كالتالى

 

ولعلك الان تعتقد ان الـ MainThread ما هو الا Thread بداخله ميثود اسمها run مثلما انشئنا الثريدات الاضافية فى الدرس السابق لكن فى الواقع يحتوى هذا الثريد على ما هو أكثر حيث يكون كالتالى

 

حيث يحتوى الـ MainThread على ما يعرف بالـ Message Queue او طابور الرسائل ويمكن تشبيهه بالسير الكهربائى او السير الآلى فى احد المصانع حيث يحتوى على Messages وهى عباره عن اكواد سيتم تنفيذها كل الاكواد التى كتبتها فى التطبيق وستنفذ فى الـ MainThread يتم ارسالها الى الـ Message Queue كود بكود على هيئة Message وراء Message ليقوم الـ Looper بمعالجة الـ Message وتنفيذها ثم العودة وتنفيذ Message اخرى ثم العودة وهكذا يظل فى Loop ودوران دائم طالما التطبيق يعمل حتى لو كان الـ Message Queue فارغ حيث التطبيق مفتوح ولا يتفاعل معه المستخدم

 

الـ Looper 

هو عباره عن كلاس يقوم بعمل loop دائم داخل الـ Thread لابقائه حيا لانه  فى الوضع العادى عندما يقوم الـ Thread بتنفيذ مهمة وينتهى منها فان الثريد ينتهى تلقائيا ويتوقف تخيل لو تم تطبيق هذا المبدأ على الـ MainThread فعند فتح التطبيق سيقوم الـ MainThread بتنفيذ الكود الخاص بتحميل الشاشة وعرضها setContnetView وما الى ذلك وبعدها ان لم يقم المستخدم بسرعة بالضغط على زر او تفاعل مع التطبيق فان الـMainThread يتوقف ويقوم التطبيق بالاغلاق لكن لحسن الحظ يبقى الـ Looper يعمل حتى لو لم يكن المستخدم يتفاعل مع التطبيق وكان الـ Message Queue فارغ .

يمكنك  المحاولة بشكل عبثى  لايقاف الـ looper الخاص بالـ MainThread كالتالى 😀

فى اى مكان فى الـ MainActivity

وشاهد النتيجة بنفسك .

 

 

وبالتاكيد قابلت الـ Handler من قبل وقمت باستخدام الميثود post من قبل فى احد الاكواد فتعالى نلقى نظرة عن قرب .

 

الـ Handler  

يقوم الـ Handler بالتواصل مباشرة مع الـ MessageQueue الخاص بالـ Thread  ومع الـ Looper ويقوم بتمرير الاكواد الى الـ Message Queue الخاص بالـ Thread ليقوم الـ Looper بتنفيذها  فعندما تقوم بعمل Handle handler = new Handler(); فانه يتم ربط الـ handler بالـ Looper  الحالى للثريد وبالتالى بالـ Message Queue وحينها يمكنك استخدام handler.post وتمرير Runnable اليها  وهى الـ task التى تريد ارسالها للـ mainThread ويحتوى كلاس الـ View على Handler بشكل افتراضى فيمكنك استخدام الميثود post او postDelay من خلال اى view وساستخدمها الان من خلال الـ TextView  كالتالى :

 

وتعتبر طريقة الـ handler هى طريقة فعالة لتواصل Thread بـ Thread اخر وهو ما تم هنا عندما اتصل الـ Thread الذى انشأنها بالـ MainThread  وهناك طرق اخرى لاتصال الـ Threads مع بعضهم البعض مثل الـ SharedMemory و طريقة الـ Pipe لكن فى الاندرويد يعتبرو ذو اهمية اقل فى وجود الـ Handler الذى يجعل الامور اسهل .

 

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

السابق
الـ MultiThreading بالعربية – الدرس الأول
التالي
مكتبة Butter Knife والوصول للمكونات بشكل أسرع

7 تعليقات

أضف تعليقا

  1. Ahmed Ali قال:

    كالعادة شرح رائع 🙂

  2. مجدي قال:

    بارك الله فيك شرح في غاية الروعة

  3. Esraa Qutb قال:

    شرح رائع .. جُزيتم خيـرا ً

  4. mina قال:

    ممكم مساعد في طريقة ضبط اكثر من منبه في اليوم وكل منبه يحمل اشعار معين للمستحدم هل يتم استخدام service او broadcast او الاثنين معا برجاء المساعده

  5. هبه قال:

    الله يجعله فى ميزان حسناتك ……… بجد شرح ممتاز

  6. محمد قال:

    بارك الله فيك هنداوى

اترك تعليقاً

هذا الموقع يستخدم Akismet للحدّ من التعليقات المزعجة والغير مرغوبة. تعرّف على كيفية معالجة بيانات تعليقك.