Thread ها در برنامه نویسی اندروید

P O U R I A

مدیر مهندسی شیمی مدیر تالار گفتگوی آزاد
مدیر تالار
فهرست مطالب:

  1. مفهوم Thread در برنامه نویسی اندروید و همچنین توضیحاتی در مورد همزمان سازی (Synchronizing)
  2. ساخت یک Thread جدید و اجرای یک سری کد در آن، در برنامه نویسی اندروید
  3. اجرای کدهایی که نیاز به بروزرسانی (User Interface) UI دارند، هنگامی که در حال اجرای یک سری کد در Thread ای غیر از Thread اصلی برنامه هستیم، با استفاده از روش runOnUiThread در یک Activity ، در برنامه نویسی اندروید


منبع: kelidestan
 

P O U R I A

مدیر مهندسی شیمی مدیر تالار گفتگوی آزاد
مدیر تالار
مفهوم Thread در برنامه نویسی اندروید و همچنین توضیحاتی در مورد همزمان سازی (Synchronizing)

مفهوم Thread در برنامه نویسی اندروید و همچنین توضیحاتی در مورد همزمان سازی (Synchronizing)

در سیستم عامل های مختلف (از جمله اندروید)، thread ها یکی از مفاهیم اصلی می باشند که به ما قابلیت انجام چند کار (multitasking) را می دهند، به گونه ای که بتوانیم عملیات های مختلف را به شکلی مدیریت کنیم که هیچ اختلالی برای یکدیگر ایجاد نکنند. در واقع با استفاده از thread ها می توانیم اجرای موازی (parallel execution) عملیات های مختلف در برنامه ها (applications) را امکان پذیر کنیم.


شاید برای درک مفهوم thread ، بهتر باشد که یک مثال ساده بزنم. شما thread را به عنوان یک جاده یک طرفه در نظر بگیرید که ماشین ها پشت سرهم در حال عبور از آن هستند. همچنین بخش های مختلف کدهای برنامه را هم به عنوان ماشین ها در نظر بگیرید. بنابراین جلو رفتن ماشین ها در جاده، به معنای همان اجرا شدن کدها است. اکنون فرض کنید که جاده مورد نظر یک بانده است و ترافیک سنگینی هم در آن وجود دارد. مسلما هر ماشینی، یک هدف خاص دارد، شاید یکی برایش اهمیت نداشته باشد که کی به مقصد برسد، اما یکی دیگر، ماشین آمبولانس باشد که باید به بیمارستان برسد. در واقع با این مثال قصد داشتم بگویم که بخش های مختلف کدها، دارای اولویت بندی متفاوت و همچنین سرعت های متفاوت برای اجرا شدن هستند و اگر قرار باشد که به ترتیب اجرا شوند (مثل ماشین هایی که در یک جاده یک بانده، پشت سرهم گیر افتاده اند)، برنامه کند شده (ترافیک ایجاد می شود) و حتی گاهی آنچه در نظر داریم را اصلا نمی توانیم اجرا کنیم و کل عملیات ها قفل می شود (یک مرده توی آمبولانس، روی دستمون میمونه) (اگر در سیستم عامل های مختلف مثل ویندوز دیده باشید، گاهی یک برنامه قفل می شود و پیامی به ما نشان داده می شود با این عنوان که دیگر برنامه پاسخگو نیست، این موارد نیز به همین صورت ایجاد می شوند). پس باید جاده را چند بانده کنیم و ماشین ها را از باندهای مختلف عبور بدهیم، بنابراین برخی مواقع، تنها یک thread کافی نیست و باید چند thread را به کار ببریم.


هنگامی که یک برنامه اندروید را اجرا می کنیم، سیستمی که برای اجرای برنامه اندروید به کار می رود، یک thread را می سازد که به صورت پیش فرض، تمام بخش های برنامه اندروید، در این thread اجرا می شوند. این thread را thread اصلی (main thread) می نامند. وظیفه اولیه thread اصلی این است که پاسخ های مربوط به تعامل کاربر با نماهای (views) برنامه اندروید را اجرا نماید (event handling). هر بخش از کدهای برنامه اندروید که قرار باشد اجرا شود، در همین thread اصلی اجرا می شود (چون پیش فرض همین است).
حال فرض کنید قرار باشد بخشی از کدها در thread اصلی اجرا شود که زمانبر (time consuming) است (مثلا دریافت اطلاعات از اینترنت که بر اساس سرعت دریافت اطلاعات، متغیر است)، همین بخش باعث می شود که اجرای کدهای سایر بخش ها در thread اصلی با مشکل روبرو شود و کل فرآیند، کند یا اصلا قفل شود (در جاده یک بانده، یک ماشین، راه سایر ماشین ها را سد می کند). بنابراین راه حل این است که بخشی از کدها را که حدس می زنیم زمانبر (time consuming) هستند، در یک thread جداگانه اجرا کنیم (چند بانده کردن جاده).



توضیحاتی در مورد همزمان سازی (Synchronizing) :

با توجه به توضیحاتی که دادیم، اصل اول این خواهد بود که چنانچه تشخیص دادیم یک عملیات، عملیاتی زمانبر است، هرگز نباید آن را در thread اصلی اجرا کنیم و آن را در یک thread جداگانه اجرا خواهیم کرد. علاوه بر این، یک اصل دیگر هم وجود دارد و آن این است که کدی که در یک thread جداگانه (به غیر از thread اصلی برنامه اندروید) اجرا می شود، تحت هیچ شرایطی نباید بخش تعامل با کاربر (user interface) برنامه اندروید را به روزرسانی (update - تغییر دادن) کند. هر تغییری (بروزرسانی) در بخش تعامل با کاربر (user interface) باید توسط thread اصلی (main thread) انجام شود. دلیل این موضوع این است که Android UI toolkit به صورت thread-safe نیست و فقط در همین حد بدانید که این ویژگی باعث می شود که اگر بخواهیم توسط چند thread ، بخش تعامل با کاربر (user interface) را تغییر بدهیم، مشکلات پیش بینی نشده ای به وجود می آید. بنابراین برای مواردی که کد thread ای که جدای از thread اصلی است، نیاز دارد که بخش تعامل با کاربر (user interface) را به روزرسانی کند (update)(تغییر بدهد)، باید از همزمان سازی (synchronizing) با thread اصلی (main UI thread) استفاده کنیم. در این روش، thread اصلی، پیام هایی را از thread مورد نظر دریافت می کند و بر اساس آنها، بخش تعامل با کاربر (user interface) را بروزرسانی (update) خواهد کرد.
 

P O U R I A

مدیر مهندسی شیمی مدیر تالار گفتگوی آزاد
مدیر تالار
ساخت یک Thread جدید و اجرای یک سری کد در آن، در برنامه نویسی اندروید

ساخت یک Thread جدید و اجرای یک سری کد در آن، در برنامه نویسی اندروید

قبلا در پست بالا ، در مورد مفهوم thread و همچنین در مورد علت ساخت thread های جدید و اجرای کدها در thread های جداگانه صحبت کردیم. اکنون قصد داریم شرح دهیم که چگونه می توانیم یک thread جدید بسازیم و یک سری کد را در آن thread جدید اجرا کنیم.

با کدهای زیر، می توانیم یک thread جدید بسازیم که یک سری کد را اجرا می کند :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace][B]new[/B] [COLOR=#003399]Thread[/COLOR][COLOR=#009900]([/COLOR][B]new[/B] [COLOR=#003399]Runnable[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]

    @Override
    [B]public[/B] [COLOR=#000066][B]void[/B][/COLOR] run[COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]

        [COLOR=#666666][I]// your codes[/I][/COLOR]

    [COLOR=#009900]}[/COLOR]
[COLOR=#009900]}[/COLOR][COLOR=#009900])[/COLOR].[COLOR=#006633]start[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR][/FONT]
[/FONT][/COLOR]
که در کد بالا، به جای عبارت // your codes ، باید کدهایی که قصد داریم در این thread جدید اجرا شوند را بنویسیم.

دقت شود که با این نوع کدنویسی، به محض ساخت thread ، کدهای مورد نظرمان نیز در آن اجرا می شوند.

بد نیست که همین کد بالا را به شیوه ای دیگر بنویسیم :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace][COLOR=#003399]Runnable[/COLOR] runnable [COLOR=#339933]=[/COLOR] [B]new[/B] [COLOR=#003399]Runnable[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]
    [B]public[/B] [COLOR=#000066][B]void[/B][/COLOR] run[COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]         
                
        [COLOR=#666666][I]// your codes[/I][/COLOR]
                
    [COLOR=#009900]}[/COLOR]
[COLOR=#009900]}[/COLOR][COLOR=#339933];[/COLOR]
[COLOR=#003399]Thread[/COLOR] myThread [COLOR=#339933]=[/COLOR] [B]new[/B] [COLOR=#003399]Thread[/COLOR][COLOR=#009900]([/COLOR]runnable[COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR]
myThread.[COLOR=#006633]start[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR][/FONT]
[/FONT][/COLOR]
با کدنویسی بالا، thread ساخته شده دارای نام myThread می باشد که در خط زیر اعلام کرده ایم که اجرا شود :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace]myThread.[COLOR=#006633]start[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR][/FONT]
[/FONT][/COLOR]
 

P O U R I A

مدیر مهندسی شیمی مدیر تالار گفتگوی آزاد
مدیر تالار
اجرای کدهایی که نیاز به بروزرسانی (User Interface) UI دارند

اجرای کدهایی که نیاز به بروزرسانی (User Interface) UI دارند

اجرای کدهایی که نیاز به بروزرسانی (User Interface) UI دارند، هنگامی که در حال اجرای یک سری کد در Thread ای غیر از Thread اصلی برنامه هستیم، با استفاده از روش runOnUiThread در یک Activity ، در برنامه نویسی اندروید :


قبلا مفهوم thread را شرح دادیم و همچنین تذکر دادیم که یک thread جداگانه (به غیر از thread اصلی برنامه اندروید) که در حال اجرا است، تحت هیچ شرایطی نباید بخش تعامل با کاربر (user interface) برنامه اندروید را به روزرسانی (update - تغییر دادن) کند. هر تغییری (بروزرسانی) در بخش تعامل با کاربر (user interface) باید توسط thread اصلی (main thread) انجام شود (در غیر این صورت، مشکلاتی به وجود می آید). به thread اصلی، main UI thread نیز گفته می شود، زیرا تنها این thread است که با UI سر و کار دارد.چنانچه بخواهیم در یک thread (که thread ای غیر از thread اصلی برنامه است)، کدهایی را اجرا کنیم که UI را تغییر بدهد، باید آن کدها را با روش runOnUiThread اجرا نماییم. یعنی مثلا فرض کنید که ما کدهایی را داشته ایم که به صورت معمولی، در میان کدهای Activity می نوشته ایم (که UI را تغییر می داده اند) :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace][COLOR=#666666][I]// your codes[/I][/COLOR][/FONT]
[/FONT][/COLOR]
حال یک thread جدید ساخته ایم (پست قبل) و قصد داریم که همان کدها را در thread جدید اجرا کنیم. این بار باید آن کدها را در thread جدید (که thread ای غیر از thread اصلی برنامه است) ، به صورت زیر اجرا نماییم :
کد:
[COLOR=#000000][FONT=Tahoma][FONT=monospace]runOnUiThread[COLOR=#009900]([/COLOR][B]new[/B] [COLOR=#003399]Runnable[/COLOR][COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]

    @Override
    [B]public[/B] [COLOR=#000066][B]void[/B][/COLOR] run[COLOR=#009900]([/COLOR][COLOR=#009900])[/COLOR] [COLOR=#009900]{[/COLOR]

        [COLOR=#666666][I]// your codes[/I][/COLOR]

    [COLOR=#009900]}[/COLOR]
[COLOR=#009900]}[/COLOR][COLOR=#009900])[/COLOR][COLOR=#339933];[/COLOR][/FONT]
[/FONT][/COLOR]
از خود اسم runOnUiThread نیز می توان به عملکرد آن پی برد، در واقع اسم آن شرح می دهد که این روش برای اجرای یک سری کد در thread اصلی برنامه (که آن را main UI thread نیز می نامیم)، به کار می رود.
 
بالا