本文通過例子來驗證和說明使用Handler對象開啟的線程是否和主線程為在同一線程中。
程式結構圖如下:
[1] HandlerActivity.java中的源碼如下:
[html] view plaincopyprint?
- package com.andyidea.handlerdemo2;
-
- import android.app.Activity;
- import android.os.Bundle;
- import android.os.Handler;
- import android.os.HandlerThread;
- import android.os.Looper;
- import android.os.Message;
- import android.util.Log;
-
- public class HandlerActivity extends Activity {
-
- private Handler handler = new Handler();
-
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- //handler.post(r);
- setContentView(R.layout.main);
- Log.e("activity-->" ,Thread.currentThread().getId() + "");
- Log.e("activityname-->" ,Thread.currentThread().getName() + "");
-
- //與主線程同一線程
- handler.post(r);
-
- //與主線程不同線程
- HandlerThread handlerThread = new HandlerThread("handler_thread");
- handlerThread.start();
- //HandlerThread線程對象要啟動後,
- //通過handlerThread.getLooper()方法才能獲得Looper對象
- MyHandler myHandler = new MyHandler(handlerThread.getLooper());
- Message msg = myHandler.obtainMessage();
- msg.sendToTarget(); //發送訊息的方式
- }
-
- //建立一個線程對象
- Runnable r = new Runnable() {
-
- @Override
- public void run() {
- Log.e("handler-->" ,Thread.currentThread().getId() + "");
- Log.e("handlername-->" ,Thread.currentThread().getName() + "");
- try{
- Thread.sleep(10*1000);
- }catch(InterruptedException e){
- e.printStackTrace();
- }
- }
- };
-
- //建立Handler對象
- class MyHandler extends Handler{
-
- public MyHandler(){
-
- }
-
- public MyHandler(Looper looper){
- super(looper);
- }
-
- @Override
- public void handleMessage(Message msg) {
- Log.e("handler-->" ,Thread.currentThread().getId() + "");
- Log.e("handler-->" ,Thread.currentThread().getName() + "");
- }
-
- }
- }
package com.andyidea.handlerdemo2;</p><p>import android.app.Activity;<br />import android.os.Bundle;<br />import android.os.Handler;<br />import android.os.HandlerThread;<br />import android.os.Looper;<br />import android.os.Message;<br />import android.util.Log;</p><p>public class HandlerActivity extends Activity {</p><p>private Handler handler = new Handler();</p><p> @Override<br /> public void onCreate(Bundle savedInstanceState) {<br /> super.onCreate(savedInstanceState);<br /> //handler.post(r);<br /> setContentView(R.layout.main);<br /> Log.e("activity-->" ,Thread.currentThread().getId() + "");<br />Log.e("activityname-->" ,Thread.currentThread().getName() + "");</p><p>//與主線程同一線程<br />handler.post(r);</p><p>//與主線程不同線程<br />HandlerThread handlerThread = new HandlerThread("handler_thread");<br /> handlerThread.start();<br /> //HandlerThread線程對象要啟動後,<br /> //通過handlerThread.getLooper()方法才能獲得Looper對象<br /> MyHandler myHandler = new MyHandler(handlerThread.getLooper());<br /> Message msg = myHandler.obtainMessage();<br /> msg.sendToTarget(); //發送訊息的方式<br /> }</p><p> //建立一個線程對象<br /> Runnable r = new Runnable() {</p><p>@Override<br />public void run() {<br />Log.e("handler-->" ,Thread.currentThread().getId() + "");<br />Log.e("handlername-->" ,Thread.currentThread().getName() + "");<br />try{<br />Thread.sleep(10*1000);<br />}catch(InterruptedException e){<br />e.printStackTrace();<br />}<br />}<br />};</p><p>//建立Handler對象<br />class MyHandler extends Handler{</p><p>public MyHandler(){</p><p>}</p><p>public MyHandler(Looper looper){<br />super(looper);<br />}</p><p>@Override<br />public void handleMessage(Message msg) {<br />Log.e("handler-->" ,Thread.currentThread().getId() + "");<br />Log.e("handler-->" ,Thread.currentThread().getName() + "");<br />}</p><p>}<br />}
運行程式後,我們通過Logcat控制台的log.e輸出可以看到結果如下:
通過驗證,可以看到如果只是通過Handler對象的post()方法,只是把一個子線程對象放到主線程隊列中,並不是開啟了一個子線程。通過HandlerThread對象方式才是開啟了一個新的線程去執行程式。