انشاء نمط الـ HandlerThreads

Mohammad Laifمنذ 3 سنوات

بسم الله الرحمن الرحيم
السلام عليكم ورحمة الله وبركاته

 

في الدرس السابق رئينا كيفية انشاء نمط  الـ Handler و Looper و Thread لإرسال Message بين الخيوط الحاسوبية واستلام النتائج. في هذا الدرس سنقوم بإرسال Runnable يحتوي على شفرتنا البرمجية بإستخدام نمط الـ HandlerThreads ومن ثم استلام النتائج. فهذا النمط مشابه للسابق ولكنه اسهل وايسر منه. فمطورين الاندرويد Android SDK قد اختصرو الكثير لجعل برمجتك اسهل.

 

بعكس النمط السابق الذي قمنا بإرسال رساله Message من الخيط الحاسوبي الرئيسي تحتوي على اسم العمليه, ثم سيقوم الخيط المخصص في تشغيل الشفره التي توافق تلك الرسالة. في هذا النمط سوف نقوم بإرسال Runnable كامل يحتوي على شفترتنا البرمجية.

 

ماذا سننشئ

 

  • خيط حاسوبي باستخدام واجهة الـ Runnable وتحتوي على شفرتنا البرمجية بإسم MyFirstRunnable. تستطيع مراجعة الدرس انشاء الخيط الحاسوبي - انشاء خيط حاسوبي بإستخدام الواجهة الـ Runnable لرؤية كيفية انشاء خيط حاسوبي بإستخدام هذه الواجهه.
  • كلاس الـ MainActivity.
    • تحتوي على حقل لعنصر هذا النمط وهو الـ HandlerThread وايضاً على حقل اخر خاص بالـ Handler للخيط الحاسوبي الرئيسي.
    • سنجعلها تقوم بعمل implements للواجة Handler.Callback حتى نقوم بإستلام النتائج من الخيط الاخر الى الخيط الرئيسي بعد اجراء العملية.

 

 

خطوات انشاء نمط الـ HandlerThreads في الاندرويد

خطوات انشاء الخيط الحاسوبي بإستخدام واجهة الـ Runnable:

  • نعمل implement للواجهه Runnable.
  • نعمل override للدالة run ونضع به الشفره المراد تشغيلها على الخيط المخصص.
  • ننشئ حقل للـ Handler خاص بالخيط الرئيسي (حلقه وصل).
  • ننشئ Constructor يأخد Handler الخيط الرئيسي.

 

انشاء كلاس Runnable

عمل implement للواجهه Runnable:

public class MyFirstRunnable implements Runnable{

}

 

عمل override للدالة run:

public class MyFirstRunnable implements Runnable{
    @Override
    public void run() {

    }
}

 

انشاء الحقول:

private WeakReference<Handler> mMainThreadHandler;

 

لماذا WeakReference؟ هكذا نعلم الـ Garbage Collector بأن هذا العنصر نريد تنظيفه, حتى وان كان مرتبط بعناصر اخرى. وكل هذا حتى لايصبح لدينا مشاكل في الذاكره Memory Leaks.

 

 انشاء Constructor ياخد الـ Handler الخاص بالخيط الرئيسي:

public MyFirstRunnable(Handler mainThreadHandler) {
    mMainThreadHandler = new WeakReference<>(mainThreadHandler);
}

 

خطوات التعديلات على الـ Activity:

  • نعمل implement للواجهه Handler.Callback.
  • نعمل حقل للـ Handler من نوع HandlerThread (الذي يوفره الاندرويد وهذا النمط قائم عليه فهو يختصر الكثير جدا).
  • نعمل حقل للـ Handler الخاص بالخيط الرئيسي.
  • نعمل Override للدالة onStart ونجهز بها الـ Handler للخيط الرئيسي والهاندلر HandlerThread.
  • نعمل override للدالة onStop لإطفاء الـ HandlerThread.
  • في زر FloatingActionButton سنضع امر انشاء الـ Handler ثم ارسال الـ Runnable الى الخيط المخصص.

 

التعديلات على الـ Activity

عمل implement للواجهه Handler.Callback:

public class Main3Activity extends AppCompatActivity implements Handler.Callback {
}

 

انشاء الحقول:

private HandlerThread mHandlerThread;
private Handler mMainThreadHandler;

لاحظ حقل هذا النمط وهو الـ HandlerThread فلا نحتاج الى انشاء كلاسات وماشبه ذلك كما بالدرس السابق.

 

عمل Override للدالة onStart ونجهز بها الـ Handler للخيط الرئيسي والهاندلر HandlerThread:

@Override
protected void onStart() {
    super.onStart();

    mHandlerThread = new HandlerThread("My Awesome Thread");
    mHandlerThread.start();

    mMainThreadHandler = new Handler(this);
}

 

عمل override للدالة onStop لإطفاء الـ HandlerThread:

@Override
protected void onStop() {
    super.onStop();
    mHandlerThread.quit();
}

 

في زر FloatingActionButton سنضع امر انشاء الـ Handler ثم ارسال الـ Runnable الى الخيط المخصص باستخدام الـ Handler:

Handler backgroundHandler = new Handler(mHandlerThread.getLooper());
backgroundHandler.post(new MyFirstRunnable(mMainThreadHandler));

لاحظ طريقة انشاء الـ Handler استخدمنا الـ Lopper الخاص بالـ HandlerThread لإنشاءه. ثم قمنا بارسال الـ Runnable الذي يحتوي على شفرتنا البرمجيه الى الخيط الخلفي باستخدام دالة post في الـ Handler الخلفي الذي انشئناه.

 

امثله كاملة

توجد امثلة كاملة للكلاسات في رابط مشروع الدورة او على الروابط التالية:

 

في هذا الدرس تعرفنا على طريقة صنع خيط حاسوبي بنمط الـ HandlerThreads وإرسال Runnable يحتوي على شفرتنا البرمجية. في الدرس القادم سنتعرف على نمط الـ Thread Pools والذي يسمى ايضاً بالـ Executors فهو نمط مشهور جداً ويكثر استخدامته كثيراً مع قواعد البيانات والاتصال مع الشبكة العنكبوتيه الانترنت. بل حتى ان نمط الـ AsyncTask المشهور تم تحويل شفرته البرمجيه مؤخراً من قبل الـ Android SDK Developer ليعمل على هذا النمط.

 

رابط الكلاسات المستخدمه في هذا الدرس:

للحصول على رابط المشروع راجع درس المقدمة.
 

المصادر والمراجع:

للمزيد راجع درس المقدمة.
 

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

المحاضر

Mohammad Laif

محتوى الدورة

تمهيد
1 مقدمة
2 تعرف على التزامن (الـ Concurrency)
3 اخطاء التزامن (الـ Concurrency) الشائعة
العمليات Processes
1 الهيكلة الهندسية لبيئة نظام الاندرويد
2 طبقة الـ Android Runtime و العمليات Processes
3 انواع العمليات (Processes)
الخيوط الحاسوبية Threads
1 الخيوط الحاسوبية (Threads)
2 مكونات الخيوط الحاسوبية (Thread)
3 انشاء الخيط الحاسوبي
أنماط التصميم للخيوط الحاسوبية
1 انشاء نمط الـ Handler و Looper و Thread
2 انشاء نمط الـ HandlerThreads الدرس الحالي
3 ماهو نمط الـ Thread Pools (الـ Executors)
4 استخدام نمط الـ Thread Pools كـ Singleton
5 استخدام الـ Callable مع نمط الـ Thread Pools
6 انشاء بركة خيوط حاسوبية Thread Pools لتسريع قاعدة البيانات
7 انشاء نمط الـ AsyncTask
8 انشاء نمط الـ Loader
الـ Broadcasts
1 تعرف على الـ Broadcast Receiver
2 انشاء الـ Broadcast Receiver بشكل ثابت
3 انشاء الـ Broadcast Receiver بشكل ديناميكي
4 استخدام الـ Local Broadcast للتخاطب بين المكونات
الـ Services
1 تعرف على الـ Services
2 انشاء الـ Started Service
3 انشاء الـ Intent Service
4 انشاء الـ Bound Service
5 استخدام الـ ResultReceiver للتخاطب مع الـ Intent Service
6 استخدام الـ Broadcast للتخاطب مع الـ Started Service
الـ Alarm Manager
1 تعرف على الـ Alarm Manager
2 طرق استخدام الـ Alarm Manager
الـ Jobs
1 استخدام الـ Android JobSchedualer
2 استخدام الـ Firebase JobDispatcher
3 استخدام الـ WorkManager من حزمة JetPack

الكلمات الدليلية

عن الدرس

0 إعجاب
2 متابع
0 مشاركة
1715 مشاهدات
منذ 3 سنوات

التعليقات (0)

لايوجد لديك حساب في عالم البرمجة؟

تحب تنضم لعالم البرمجة؟ وتنشئ عالمك الخاص، تنشر المقالات، الدورات، تشارك المبرمجين وتساعد الآخرين، اشترك الآن بخطوات يسيرة !