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

الـ MultiThreading بالعربية – الدرس الأول

يعتبر مفهوم أو مبدأ الـ MultiThreading مهم جدا أثناء البرمجة ولاختصر القصة تعالى لنتخيل الحياة بدون MultiThreading  و MultiProcessing

تخيل انك تستطيع ان تقوم بمهمة واحد فقط على جهاز الكمبيوتر لا تستطيع ان تفتح برنامجين فى نفس الوقت حتى البرنامج الواحد لا يمكن أن يقوم بمهمتين فى نفس الوقت لذلك تخيل انك تجرى اتصال مع صديقك عبر skype واخبرك انه ارسل لك رابط احد المحاضرات او رابط كتاب جيد لقد ارسله لك فى شات الاسكايب وبالتالى لا تستطيع قراءة الشات فى نفس وقت الاتصال لاننا اتفقنا انه لن تتم مهمتين فى نفس الوقت بالتالى يجب عليك غلق الاتصال مع صديقك لكى تشاهد الشات .. حسنا اغلقت الاتصال شاهدت الشات وحصلت على رابط الملف وتريد فتحه فى المتصفح سوف تضطر لاغلاق الـ skype  تمام حتى تستطيع فتح المتصفح وعند بدء الدون لود ستضطر لغلق المتصفح وانتظار الـ downloadmanager ليقوم بالتحميل ولا تسطيع فعل اى شىء اخر اثناء التحميل الا باغلاق برنامج التحميل وهكذا .. يستطيع الجهاز القيام بمهمة واحدة فقط هل تخيلت حجم المأساه والمعاناه فى ذلك ؟  وكعادة المبرمجين منذ القدم يقومون بحل المشاكل وتقديم حلول رائعة وظهر مفهوم الـ MultiThreading مع الوقت وله الفضل فى انك تفتح احد البرامج وتقوم باكثر من مهمة فى نفس الوقت فما هو الـ MultiThreading وما هو وكيف نقوم بتطبيقه فى الأندرويد .

 

أحد المقالات السابقة  الـ AsyncTask البديل البسيط للـ Thread فى الأندرويد تحدثنا فيها عن الـ AsyncTask مبديل مبسط للـثريد وربما عرفت نوعا ما هو الثريد ولماذا نحتاجه وسنتحدث هنا بشكل مفصل أكثر عن  ما يتعلق بالـ MultiThreading

 

الـ Process

أى تطبيق يتم فتحه فى أندرويد يقوم ببدء Process خاصه به تفتح تطبيق يوتيوب يقوم ببدء Process تفتح تطبيق Whatsapp يقوم ببدء Process وبشكل عام مع اى تطبيق حتى ولو تطبيق Hello world  تحتوى هذه الـ Process على  MainThread بشكل افتراضى وهو يعتبر الثريد الاساسى ويطلق عليه أحيانا UI Thread  وهو عباره عن الـ Thread الذى يتم تنفيذ كل الاكواد الحاليه فى تطبيقك من خاله بشكل متتابع وتسلسلى  .

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

لإنشاء ثريد جديد سوف نستخدم الـكلاس  Thread كالتالى

وفى هذه الحالة تجد أن الـ Constructor  يمكن أن يأخذ اشياء عديدة لكن فى ابسط الاحوال سوف يأخذ Runnable لنستيطع تنفيذ كود من خلاله سنأتى للـ Runnable بعد قليل لكن الان سنقوم بانهاء السطر بـ سيمى كولن .

 

 

 

 

الان انشأنا ثريد فارغ لتشغيل الثريد فقط نستدعى الميثود start  كاالتالى :

الان اذا قمنا بتشغيل التطبيق وضغط زر الـ FloatActionButton والذى وضعت الكود السابق بداخل onClick الخاصة به سيتم تشغيل التطبيق  وعند الضغط على زر الـ FloatActionButton بالتأكيد لن يحدث شىء سوى ان هذا الثريد تم انشاؤه وتشغيله لذلك سنقوم الان باضافة كود ليقوم هذا الـ thread بتنفيذه  ولتنفيذ كود فى هذا الثريد او اى ثريد اخر يجب أن يكون داخل الميثود Run  لذلك سوف نقوم بعمل Override لها كالتالى :

 

وداخل الميثود Run تكتب الكود الذى تريد تنفيذه فى هذا الـ Thread  وبما أننى  هذا الصباح قرات على موقع Quora شاب يسأل عن طريقة عمل برنامج يقوم بطباعة Sorry الى ما لا نهاية بالجافا نظرا لأنه كان يمزح مع صديقته المبرمجة فى موضوع وزنها الزائد فكان منها ان عاقبته عندما اراد يصالحها  بان يكتب برنامج جافا يقوم بطباعة sorry الى ما لا نهاية 😀  وهو لا يعرف شيئا فى البرمجة وفى هذا المثال كود كتابة كلمة Sorry الى ما نهاية فان هذا الكود لو تم تنفيذه فى الـ MainThread سوف يجعل التطبيق يتوقف عن الإستجابة  لذلك من المناسب كتابته فى ثريد جديد كالتالى :

 

الان اذا قمنا بتشغيل التطبيق فسنجد أنه يقوم بطباعة كلمة I am Sorry فى الـ Logcat  بشكل سريع جدا جدا جدا لن يتوقف ابدا

يمكننا إنشاء Thread اخر لمهمة اخرى اذا اردت سوف اقوم بإنشاء ثريد اخر

 

وثريد ثالث أيضا

 

 

وبالتأكيد لم أنشىء ثلاث ثريدز للعبث فقط وانما لشىء اريد توضيحه .. قم بتشغيل التطبيق الان وراقب الـ Logcat  وستلاحظ أن الامر تم بطريقة نوعا ما عشوائية حيث تنفذ الثريدث فى نفس الوقت لكن بطريقة الـ Parallel اى بشكل متوازى والذى يتحكم فى هذه العملية بشكل كامل هو نظام الأندرويد نفسه  حيث يقوم بتنفيذ جزء من الثريد myThread وجزء من الـثريد herThread و جزء من hendiwareThread وهكذا احيانا ينفذ جزء أكبر من myThread وجزء قليل فى herThread و جزء كبير فى hendiwareThread   وقم بتشغيل التطبيق عدة مرات متتالية وستلاحظ ان كل مرة قد يختلف التنفيذ ولتقليل فوضى الـ Logcat سنقوم بعمل طباعة الجملة 1000 مرة فقط لك واحد مما سبق كالتالى :

 

 

قم بتشغيل التطبيق حوالى 10 او 15 مرة مثلا وراقب الـ Logcat وستجد أن كل مرة قد يختلف التنفيذ عن المرة السابقة حيث يقوم نظام الاندرويد بتشغيل الـ Threads  كما يريد وليس لك تحكم فيها قد تستطيع التحكم فى اشياء بسيطه سنعرفها لاحقا لكن فى النهاية تكون الكلمة الاخيرة فى تتابع تنفيذ الـ Threads وتنظيم تنفيذها راجعة الى الـ System نفسه وهذا ليس معناه ان الـ task لن تتم أو ستتأثر كل شىء يتم كما هو مخطط له ولا تؤثر هذه العملية على ما تريد فعله ففى النهاية ينتهى تنفيذ كل الـ threads  ويعمل التطبيق بشكل رائع لكن هذا ما يحدث فى الخلفية للعلم فقط .

الى هنا تنتهى التدوينة الاولى فى سلسلة MultiThreading بالعربية نستكمل حديثنا فى التدوينة الثانية إن شاء الله .

 

السابق
Android Webservices بالعربية – رفع الملفات من الأندرويد للسيرفر
التالي
الـ MultiThreading بالعربية – الدرس الثانى

9 تعليقات

أضف تعليقا

  1. Mahmoud Abdelwahab قال:

    ربنا يزيدك علم يا اخ هندى والله اسلوبك رائع ف الشرح والله
    انا منتظر باقى سلسله السينسورز يارب يجى دورها قريب علوضعك :v

    1. Hendiware قال:

      حاضر هخلى باسم يشوف الكومنت بتاعك وهوصل الرسالة للمسؤولين 😀

  2. مجدي قال:

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

    1. Hendiware قال:

      شكرا لك مجدى .. منور المدونة ^_^

  3. Ahmed Ali قال:

    شرح جميل جدا ربنا يزيدك كمان وكمان 🙂
    بس موضوع ال GCM اتاخر اوي ليه ؟ معلش لو بتقل عليكو بس بجد الموضوع طول 🙁

    1. Hendiware قال:

      مرحبا أحمد ،
      محمد المسؤول عن شرح الـ GCM وعدنى انه هينزل الفيديو الجاى يوم الخميس ان شاء الله هو عنده امتحانات ومشغول شوية .
      ولو مكملش الشرح واتشغل او حدث اى ظروف اخرى ان شاء الله هنكمل الشرح لكن مقالات .

      1. ahmed ali قال:

        الله يكرمك 🙂
        انا مقصدش اضغط عليه والله براحتو انا كنت بسال بس
        مشكورين

  4. moka قال:

    بركا الله فيكم و جزاكم خيرا و رحم واليدكم.
    الرجاء دروس مفصلة في android studio

  5. gothani قال:

    شرح رائع جدا
    الله يعطيكم العافيه

اترك تعليقاً

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