<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>AsyncTask &#8211; Mahdi Tajik</title>
	<atom:link href="http://www.mahditajik.ir/tag/asynctask/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.mahditajik.ir</link>
	<description>I&#039;m Mahdi Tajik. I am project manager and Full-stack Android developer. welcome to my personal website.</description>
	<lastBuildDate>Thu, 29 Nov 2018 14:18:00 +0000</lastBuildDate>
	<language>fa-IR</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.2.6</generator>

<image>
	<url>http://www.mahditajik.ir/wp-content/uploads/2015/03/cropped-sample-logo-MT-2-32x32.png</url>
	<title>AsyncTask &#8211; Mahdi Tajik</title>
	<link>http://www.mahditajik.ir</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>تفاوت Handler و Thread و AsyncTask در اندروید</title>
		<link>http://www.mahditajik.ir/%d8%aa%d9%81%d8%a7%d9%88%d8%aa-handler-%d9%88-thread-%d9%88-asynctask-%d8%af%d8%b1-%d8%a7%d9%86%d8%af%d8%b1%d9%88%db%8c%d8%af/</link>
					<comments>http://www.mahditajik.ir/%d8%aa%d9%81%d8%a7%d9%88%d8%aa-handler-%d9%88-thread-%d9%88-asynctask-%d8%af%d8%b1-%d8%a7%d9%86%d8%af%d8%b1%d9%88%db%8c%d8%af/#comments</comments>
		
		<dc:creator><![CDATA[mahdi]]></dc:creator>
		<pubDate>Tue, 30 Jan 2018 16:33:14 +0000</pubDate>
				<category><![CDATA[آموزش]]></category>
		<category><![CDATA[AsyncTask]]></category>
		<category><![CDATA[Handler]]></category>
		<category><![CDATA[Thread]]></category>
		<guid isPermaLink="false">http://www.mahditajik.ir/?p=2728</guid>

					<description><![CDATA[<p>با سلام، ممکنه برای خیلی ها این سوال پیش اومده باشه که از هرکدوم از Handler یا Thread یا AsycTask استفاده کرده باشیم و لی در حقیقت تفاوت میان آنها را به درستی نشناسیم. در این مقاله می خواهیم این تفاوت ها و محل مناسب استفاده از هر یک را برسی کنیم. اول لازم هست ...</p>
<p>نوشته <a rel="nofollow" href="http://www.mahditajik.ir/%d8%aa%d9%81%d8%a7%d9%88%d8%aa-handler-%d9%88-thread-%d9%88-asynctask-%d8%af%d8%b1-%d8%a7%d9%86%d8%af%d8%b1%d9%88%db%8c%d8%af/">تفاوت Handler و Thread و AsyncTask در اندروید</a> اولین بار در <a rel="nofollow" href="http://www.mahditajik.ir">Mahdi Tajik</a> پدیدار شد.</p>
]]></description>
										<content:encoded><![CDATA[<p><img decoding="async" loading="lazy" class="aligncenter wp-image-2731 size-full" src="http://www.mahditajik.ir/wp-content/uploads/2018/01/asynctask.jpg" alt="AsyncTask" width="800" height="486" srcset="http://www.mahditajik.ir/wp-content/uploads/2018/01/asynctask.jpg 800w, http://www.mahditajik.ir/wp-content/uploads/2018/01/asynctask-300x182.jpg 300w, http://www.mahditajik.ir/wp-content/uploads/2018/01/asynctask-768x467.jpg 768w" sizes="(max-width: 800px) 100vw, 800px" /></p>
<p style="text-align: justify;">با سلام، ممکنه برای خیلی ها این سوال پیش اومده باشه که از هرکدوم از <strong>Handler</strong> یا <strong>Thread</strong> یا <strong>AsycTask</strong> استفاده کرده باشیم و لی در حقیقت تفاوت میان آنها را به درستی نشناسیم. در این مقاله می خواهیم این تفاوت ها و محل مناسب استفاده از هر یک را برسی کنیم.</p>
<p style="text-align: justify;">اول لازم هست تا با تعریف هرکدام بیشتر آشنا شویم.</p>
<p style="text-align: right;"><strong>Thread</strong></p>
<blockquote>
<p style="text-align: left;">A thread is a thread of execution in a program. The Java Virtual Machine allows an application to have multiple threads of execution running concurrently.</p>
</blockquote>
<p style="text-align: justify;">ترد یا رشته واحد های کلی پردازش وظایف هستند که هر برنامه می تواند تعدادی ترد داشته باشد. هر ترد اولویتی در سیستم دارد و تردهای ایجاد شده توسط یک ترد دیگر، اولویت هم سطح خواهند داشت. در اندروید هر برنامه یک ترد اصلی یا <strong>Main thread</strong> دارد و وقتی  <strong>thread</strong> جدیدی ایجاد می کنیم پردازش ها جدا از اتفاقات ترد اصلی روی می دهد. اما برای هماهنگ کردن و یا به عنوان مثال بازگشت جواب باید اینکار را بصورت دستی توسط <strong>message</strong> یا <strong>callback</strong> مدیریت کنیم. ( <a href="http://www.mahditajik.ir/%d9%86%d8%ad%d9%88%d9%87-%d8%a7%d8%b1%d8%aa%d8%a8%d8%a7%d8%b7-%d8%a8%db%8c%d9%86-thread-%d9%87%d8%a7/" target="_blank" rel="noopener"><span style="color: #3366ff;">مقاله کامل در اینجا</span></a>) در صورتی که اگر تردی ایجاد کنیم دستورالعمل های آن باعث freeze شدن برنامه نمی شود زیرا در یک ترد دیگری جاریست اما در عوض به عناصر <strong>UI</strong> که در ترد اصلی هستند دسترسی نداریم و نمی توانیم بطور مستقیم <strong>UI</strong> را تغییر دهیم.</p>
<pre class="crayon-plain-tag">new Thread(new Runnable() {
    @Override
    public void run() {
        doSomething();
    }
}).start();</pre>
<p style="text-align: right;"><strong>Handler</strong></p>
<blockquote>
<p style="text-align: left;">A Handler allows you to send and process Message and Runnable objects associated with a thread&#8217;s MessageQueue. Each Handler instance is associated with a single thread and that thread&#8217;s message queue. When you create a new Handler, it is bound to the thread / message queue of the thread that is creating it &#8212; from that point on, it will deliver messages and runnables to that message queue and execute them as they come out of the message queue</p>
</blockquote>
<p style="text-align: justify;">طبق تعریف خود گوگل با تعریف یک هندلر می توانیم پیغام یا <strong>Runnable</strong> ای را پردازش کنیم که دقیقاً در thread  کلاس تولید کننده آن قرار می گیرد و نحوه اجرا شدن آن هم به صف همان <strong>thread</strong> بستگی دارد. پس یعنی <strong>Handler</strong> های تولید شده در یک <strong>thread</strong> به ترتیب در همان <strong>thread</strong> اجرا می شوند. دستورالعمل هایی که در <strong>Handler</strong> اجرا می شوند در <strong>thread</strong> اصلی بوده و اصطلاحاً باعث  freeze  شدن برنامه می شود. اما اگر در ترد اصلی تولید شوند به عناصر UI برنامه دسترسی داریم و مثلا می توانیم یک <strong>ViewText</strong> ای را بروز رسانی کنیم.</p>
<pre class="crayon-plain-tag">new Handler().post(new Runnable() {
    @Override
    public void run() {
       doSomething();
    }
});</pre>
<p style="text-align: justify;">بطور معمول وقتی از <strong>Handler</strong> استفاده می کنیم که بخواهیم اتفاق خاصی در زمان خاصی بیافتد. مثلا فرض کنید می خواهید با تایمر <strong>View</strong> ای را آپدیت کنید.</p>
<pre class="crayon-plain-tag">new Handler().postDelayed(new Runnable() {
    @Override
    public void run() {
        // update UI after 1000 millisecons
    }
},1000);</pre>
<strong>Runable</strong></p>
<p>یک اینترفیسی است که تمامی کلاس هایی که قرار است توسط  <strong>Thread </strong>اجرا شوند، باید آن را پیاده سازی کنند که یک متد <strong>run </strong>دارد. پس هرکلاس مشخص می کند که هنگام اجرا شدن توسط Thread چکاری را انجام دهد. ( آن کار در متد run پیاده سازی می شود.) که در تمامی مثال های قبلی قابل مشاهده است.</p>
<p><strong>AsyncTask</strong></p>
<p>برای ساخت آن باید کلاسی از آن مشتق کنیم و متد های آن را <strong>Override</strong> کنیم.</p>
<ul>
<li>doInBackground</li>
<li>onPostExecute</li>
</ul>
<p style="text-align: justify;">متد <strong>doInBackground</strong> در یک ترد مجزا انجام می گیرد و جواب آن <strong>onPostExecute</strong> در ترد اصلی یا همان <strong>UI thread</strong> اتفاق می افتد که می توانیم توسط آن <strong>UI</strong> را آپدیت کنیم. البته متد های دیگری نیز دارد که تنها به این دو متد اشاره کردم. استفاده از <strong>AsyncTask</strong> بسیار در گرفتن اطلاعات از سمت <strong>web</strong> پرکاربرد است. ( در صورتی که نخواهیم از کتابخانه های نظیر Retrofit و Volley استفاده کنیم) و اصولاً در قدیم (حدود ۶ سال قبل) ترکیب <strong>HttpConnection</strong> و <strong>AsyncTask</strong> برای صدا زدن <strong>Api</strong> های سمت وب اجتناب ناپذیر بود!</p>
<pre class="crayon-plain-tag">private class MyAsycTask extends AsyncTask&lt;Void, Void, Void&gt; {

    @Override
    protected void onPreExecute() {
       //do something in Ui-thread before background work start
    }

    @Override
    protected Void doInBackground(Void... params) {
       //do something in background
        return null;
    }

    @Override
    protected void onPostExecute(Void aVoid) {
      //do something in Ui-thread
    }
}</pre>
<p style="text-align: justify;"><strong>نکته:</strong></p>
<p>یک نوع استفاده دیگر از Handler وجود دارد که در ظاهر انگار  Thread است اما:</p><pre class="crayon-plain-tag">runOnUiThread(new Runnable() {
    @Override
    public void run() {
        doSomething();
    }
});</pre><p>
توجه کنید که <strong>runOnUiThread</strong> یک نوع خاصی از <strong>Handler</strong> است که فقط در ترد اصلی اتفاق می افتد.</p>
<p>هرگونه سوال و یا نکته ای داشتید خوشحال می شم که کامنت کنید.</p>
<p>منبع: <a href="http://www.biitecode.ir" target="_blank" rel="noopener">بایت کد</a></p>
<p>نوشته <a rel="nofollow" href="http://www.mahditajik.ir/%d8%aa%d9%81%d8%a7%d9%88%d8%aa-handler-%d9%88-thread-%d9%88-asynctask-%d8%af%d8%b1-%d8%a7%d9%86%d8%af%d8%b1%d9%88%db%8c%d8%af/">تفاوت Handler و Thread و AsyncTask در اندروید</a> اولین بار در <a rel="nofollow" href="http://www.mahditajik.ir">Mahdi Tajik</a> پدیدار شد.</p>
]]></content:encoded>
					
					<wfw:commentRss>http://www.mahditajik.ir/%d8%aa%d9%81%d8%a7%d9%88%d8%aa-handler-%d9%88-thread-%d9%88-asynctask-%d8%af%d8%b1-%d8%a7%d9%86%d8%af%d8%b1%d9%88%db%8c%d8%af/feed/</wfw:commentRss>
			<slash:comments>4</slash:comments>
		
		
			</item>
	</channel>
</rss>
