<?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>Thread &#8211; Mahdi Tajik</title>
	<atom:link href="http://www.mahditajik.ir/tag/thread/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:09 +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>Thread &#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>
		<item>
		<title>نحوه ارتباط بین thread ها</title>
		<link>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/</link>
					<comments>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/#comments</comments>
		
		<dc:creator><![CDATA[mahdi]]></dc:creator>
		<pubDate>Mon, 29 Jan 2018 10:51:58 +0000</pubDate>
				<category><![CDATA[آموزش]]></category>
		<category><![CDATA[Handler]]></category>
		<category><![CDATA[runnable]]></category>
		<category><![CDATA[Thread]]></category>
		<guid isPermaLink="false">http://www.mahditajik.ir/?p=2741</guid>

					<description><![CDATA[<p>thread یا رشته عبارتند از  واحد های کلی پردازش وظایف که هر برنامه می تواند تعدادی ترد داشته باشد. هر ترد اولویتی در سیستم دارد و تردهای ایجاد شده توسط یک ترد دیگر، اولویت هم سطح خواهند داشت. در اندروید هر برنامه یک ترد اصلی یا Main thread دارد و وقتی  thread جدیدی ایجاد می ...</p>
<p>نوشته <a rel="nofollow" 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/">نحوه ارتباط بین thread ها</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 size-full wp-image-2755" src="http://www.mahditajik.ir/wp-content/uploads/2018/01/thread.jpg" alt="" width="800" height="486" srcset="http://www.mahditajik.ir/wp-content/uploads/2018/01/thread.jpg 800w, http://www.mahditajik.ir/wp-content/uploads/2018/01/thread-300x182.jpg 300w, http://www.mahditajik.ir/wp-content/uploads/2018/01/thread-768x467.jpg 768w" sizes="(max-width: 800px) 100vw, 800px" /></p>
<p style="text-align: justify;">thread یا رشته عبارتند از  واحد های کلی پردازش وظایف که هر برنامه می تواند تعدادی ترد داشته باشد. هر ترد اولویتی در سیستم دارد و تردهای ایجاد شده توسط یک ترد دیگر، اولویت هم سطح خواهند داشت. در اندروید هر برنامه یک ترد اصلی یا <strong>Main thread</strong> دارد و وقتی  <strong>thread</strong> جدیدی ایجاد می کنیم پردازش ها جدا از اتفاقات ترد اصلی روی می دهد. اما برای هماهنگ کردن و یا به عنوان مثال بازگشت جواب باید اینکار را بصورت دستی توسط <strong>message</strong> یا <strong>callback</strong> مدیریت کنیم.</p>
<p style="text-align: justify;">در این مقاله می خواهیم نحوه ارتباط با این دو روش را برسی کنیم.</p>
<p><strong>message</strong></p>
<p style="text-align: justify;">اصلی ترین راه ارتباط بین تردها پاس دادن پیام است. تردی که قرار است پیغام را دریافت کند باید دسترسی به صف پیغام ها داشته باشد که  messageQueue است و خود ترد ساده فاقد این کلاس است.</p>
<pre class="crayon-plain-tag">new Thread(new Runnable() {
    @Override
    public void run() {
        doSomething();
    }
}).start();</pre>
<p style="text-align: justify;">به شکل thread ساده و بدون messageQueue توجه کنید:</p>
<p><img decoding="async" loading="lazy" class="aligncenter size-full wp-image-2743" src="http://www.mahditajik.ir/wp-content/uploads/2018/01/Th_JAT.png" alt="" width="200" height="141" /></p>
<p style="text-align: justify;">برای افزودن messageQueue از کلاس Looper استفاده می کنیم که messageQueue را برایمان فراهم می کند.</p>
<pre class="crayon-plain-tag">new Thread(new Runnable() {
    @Override
    public void run() {
        Looper.prepare();
        doSomething();
        Looper.loop();
    }
}).start();</pre>
<p style="text-align: justify;">و بدین ترتیب messageQueue برایمان محیا می شود.</p>
<p style="text-align: justify;"><img decoding="async" loading="lazy" class="aligncenter size-full wp-image-2744" src="http://www.mahditajik.ir/wp-content/uploads/2018/01/Th_TWL.png" alt="" width="320" height="156" srcset="http://www.mahditajik.ir/wp-content/uploads/2018/01/Th_TWL.png 320w, http://www.mahditajik.ir/wp-content/uploads/2018/01/Th_TWL-300x146.png 300w" sizes="(max-width: 320px) 100vw, 320px" /></p>
<p style="text-align: justify;">حال تردی که می خواهد مسیج ارسال کند نیاز به یک <strong>Handler</strong> دارد. وظیفه Handler ارسال و پردازش پیغام مربوط به messageQueue ترد ساخته شده اش می باشد. ( همچنین اجرای Runnable که موضوع این آموزش نیست). وقتی یک Handler جدید می سازیم به threadhd ای که درون آن ساخته شده و messageQueue مربوطه متصل می شود و message ها و runnable ها را به messageQueue مربوطه می رساند و یا از روی آن اجرا می کند. در اینجا برای ارسال پیام کافیست که یک هندلر بصورتی تعریف کنیم هردو ترد دسترسی داشته باشند ( بصورت public یا پاس دادن بصورت properties) در یکی توسط آن Messagehvshg ارسال کنیم و در دیگری Message را گرفته و پردازش کنیم.</p>
<p><img decoding="async" loading="lazy" class="aligncenter size-full wp-image-2745" src="http://www.mahditajik.ir/wp-content/uploads/2018/01/Th_PAT.png" alt="" width="320" height="163" srcset="http://www.mahditajik.ir/wp-content/uploads/2018/01/Th_PAT.png 320w, http://www.mahditajik.ir/wp-content/uploads/2018/01/Th_PAT-300x153.png 300w" sizes="(max-width: 320px) 100vw, 320px" /></p>
<p style="text-align: justify;">به مثال ذیل توجه کنید:</p>
<pre class="crayon-plain-tag">private void testThreadMessaging() {

    Handler handler;

    new Thread(new Runnable() {
        @Override
        public void run() {
            Looper.prepare();

            handler = new Handler(){

                @Override
                public void handleMessage(Message msg) {
                    super.handleMessage(msg);
                    Toast.makeText(MainActivity.this, "Job finish with ( "+(float) msg.getData().getLong("jobTime")/1000+" ) seconds", Toast.LENGTH_SHORT)
                            .show();


                }
            };
            Looper.loop();
        }
    }).start();

    new Thread(new Runnable() {
        @Override
        public void run() {
            long jobTime = doSomething(ITERATION_COUNT);
            Message message = new Message();
            Bundle bundle = new Bundle();
            bundle.putLong("jobTime",jobTime);
            message.setData(bundle);
            handler.sendMessage(message);

        }
    }).start();
}</pre>
<pre class="crayon-plain-tag">private long doSomething(int iteration) {
    long startTime = System.currentTimeMillis();
    for (int i = 0; i &lt; iteration; i++) {
        Log.i("mahdi", "run: "+i);
    }
    long endTime = System.currentTimeMillis();

    return endTime - startTime ;
}</pre>
<p style="text-align: justify;">ترد اول بعد از تمام شدن کارش زمان انجام کار را به ترد دوم پاس می دهد. در اینجا handler بصورت public تعریف شده بود.</p>
<p><strong>Callback</strong></p>
<p style="text-align: justify;">در این روش ارتباط از طریق پاس دادن یک اینترفیس انجام می شود. برای اینکه مثال فرق کند ترد دریافت کننده پیام را در Ui thread قرار دادم. ( یعنی ترد جدیدی نساختم و در یک جایی در اکتیویتی تعریف کردم که می دانیم خود اکتیوتی در main thread یا همان Ui thread است).</p>
<pre class="crayon-plain-tag">private void testThreadCallBack(){

    //our receiver thread is main thread
    callBack = new ThreadCallBack() {
        @Override
        public void onMessage(Object o) {
            Log.i("mahdi", "Job finish with ( "+((Bundle) o).getLong("jobTime")/1000+" ) seconds");

        }
    };

    new Thread(new Runnable() {
        @Override
        public void run() {
            long jobTime = doSomething(ITERATION_COUNT);
            Bundle bundle = new Bundle();
            bundle.putLong("jobTime",jobTime);
            callBack.onMessage(bundle);
        }
    }).start();
}

interface ThreadCallBack{

    void onMessage(Object o);

}</pre>
<p style="text-align: justify;">برای درک بهتر کدها را اجرا کنید و نتایج را برسی کنید. در صورتی که سوال یا نکته ای داشتید کامنت کنید.</p>
<p>منبع: <a href="http://www.biitecode.ir" target="_blank" rel="noopener">بایت کد</a></p>
<p>نوشته <a rel="nofollow" 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/">نحوه ارتباط بین thread ها</a> اولین بار در <a rel="nofollow" href="http://www.mahditajik.ir">Mahdi Tajik</a> پدیدار شد.</p>
]]></content:encoded>
					
					<wfw:commentRss>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/feed/</wfw:commentRss>
			<slash:comments>8</slash:comments>
		
		
			</item>
	</channel>
</rss>
