در این شماره قصد داریم MultiThreading را در برنامهنویسی سیستم عامل آندروید بررسی کنیم.
همانطور که در شمارههای گذشته گفته شد Thread یک اجرای هم روند است، Threadها یک پشته فراخواننده برای دسترسی به متدها و متغیرهای محلی در اختیار دارد. هر برنامه دارای یک Main Thread است که وظیفه آن اجرای برنامه و تعامل با کاربر است، هر برنامه میتواند یک Thread را برای اهداف مشخصی اجرا کند. چند راه برای ایجاد یک Thread در Android وجود دارد:
۱ـ یک کلاس که از کلاس Thread به ارث رسیده باشد و متد run آن را بازنویسی کنید.
۲ـ ایجاد یک شیء نمونه از کلاس Runable .
نکته مشترک در راههای بالا این است که باید متد start فراخوانی شود.
مزایای استفاده از Threadها
۱ـ به اشتراکگذاری منابع پردازشی سیستم بین Threadها.
۲ـ اجرای کارهای سنگین (مانند ارسال اطلاعات در شبکه، پردازش عکس و...) توسط Threadهای دیگر باعث میشود Threadاصلی که UI و برقراری ارتباط با کاربر را انجام میدهد، درگیر کارهای سنگین نشده و باعث هنگ کردن آن نمیشود.
۳ـ استفاده از Threadها یک اجرای انتزاعی هم روند را برای اجرای برنامه فراهم میکند.
۴ـ برنامههایی که از چند Thread استفاده میکنند(Multi Threads Program) در سیستمهایی که چند پردازنده دارد سریعتر و راحتتر اجرا میشوند.
معایب استفاده از Thread ها
۱ـ کدنویسی شما به عنوان برنامهنویس، پیچیده میشود.
۲ـ نیاز به تشخیص/ اجتناب/ حل مشکلات deadlocks (در مورد deadlock در شمارههای پیش توضیح دادهایم) وجود دارد.
3ـ مدیریت بیشتر روی خطاهای مدیریت نشده (Unhandled Exception).
اما نتیجهای که میتوان گرفت این است که استفاده از یک سیستم به صورت Multi Thread به شرط این که درست پیاده شده باشد، به صرفهتر از سیستمی است که به صورت یک Thread اجرا میشود.
مثلا برنامهای نوشتهاید که قرار است یک کار سنگین را انجام دهد. باید UI برنامه شما با کاربر تعامل داشته باشد، یعنی کاربر احساس نکند چون کار سنگینی انجام میدهد برنامه دیگر قابل استفاده نیست. سیستم عامل آندروید برای حل این مشکل 2 روش در اختیار شما قرار میدهد:
1ـ استفاده از یک Service در پشت زمینه و اعلام یک Notification بعد از اتمام کارش به کاربر.
2ـ ایجاد یک Background Thread برای اجرای وظایفی که باید جدای ازMain Thread صورت پذیرد و زمانی که انجام شد نتیجه به کاربر اعلام شود.
روش اول مورد بحث ما نیست، اما در روش ۲، بگذارید بحث را بیشتر باز کنیم و با نحوه ایجاد و تعامل آن با رابط کاربری بیشتر آشنا شویم.
زمانی که برنامه شما اجرا میشود یک Message Queue ایجاد میکند تا به درخواستها پاسخ دهد. وقتی شما یک Thread جدای از Main Thread ایجاد میکنید، باید یک Handler برای آن بسازید تا به درخواستهایی که از سوی Thread ای که تعریف کردید، میآید پاسخ دهد. برای این کار شما به ایجاد یک نمونه از کلاس Handler نیاز دارید تا زمانی که کار Threadتمام شد، نتایج به کاربر اعلام شود و با استفاده از این کلاس این مورد را انجام دهید. شما از طریق این Handler میتوانید با Main Thread ارتباط برقرار کنید.
چند نکته حائز اهمیت است: هیچ کدام از Background Threadها نمیتواند با UI برنامه در ارتباط باشد، فقط Main Thread میتواند با UI اصلی یک Activity ارتباط برقرار کند، متغیرهای عمومی توسط یک Thread دیگر مورد استفاده قرار میگیرد و بهروزرسانی میشود.
اما نکاتی در مورد پیغامهای صفبندی شده در کلاس Handler وجود دارد. همان طور که گفته شد برای این که یک Thread با Thread اصلی برنامه تعامل داشته باشد نیاز دارد که یک Message برای آن صادر کند. این پیغام با استفاده از متد (obtainMessage) کلاس Handler ایجاد میشود، سپس دادههای مورد نظر که نیاز است باید به کاربر نمایش داده شود و هر عمل دیگر توسط این Message برای Thread اصلی برنامه ارسال میشود.
متد sendMessage یک پیغام را میتواند ارسال کند که کلاس Handler با استفاده از متد handleMessage درخواستهای صادر شده را پاسخ دهد.
به این کد دقت کنید:
Handler handler = new Handler(){
@Override
public void handleMessage(Message msg){
} };
Thread backgroundThread = new Thread(new Runable(){
@Override
public void run(){
Message msg = handler.obtainMessage();
handler.sendMessage(msg);
} });
backgroundThread.start();
در توضیح کد بالا باید گفت که ابتدا یک شیء از کلاس Hnadler میسازیم سپس متد handleMessage آن را بازنویسی میکنیم و پردازش درخواستهای صادر شده را در آن انجام میدهیم. مرحله بعد یک Thread دیگر ایجاد میکنیم و در آن پس از انجام کارهای مورد نظر یک Message برای شیء handler ارسال میکنیم. وظیفه نمایش و پردازش درخواستهای صادر شده به عهده handler است. در آخر با فراخوانی متد start شیء backgroundThread، این Thread را اجرا میکنیم.
در شمارههای بعدی بیشتر در مورد نحوه ایجاد Thread و استفاده از آن خواهیم پرداخت.
امیر بهاء الدین سبط الشیخ
در تپش این هفته، ماجرای فریب و تعرض در پوشش عرفانهای دروغین و رمالی را بررسی کردیم