Android中Handler

來源:互聯網
上載者:User

本文通過例子來驗證和說明使用Handler對象開啟的線程是否和主線程為在同一線程中。

程式結構圖如下:

[1] HandlerActivity.java中的源碼如下:

[html] view plaincopyprint?
  1. package com.andyidea.handlerdemo2; 
  2.  
  3. import android.app.Activity; 
  4. import android.os.Bundle; 
  5. import android.os.Handler; 
  6. import android.os.HandlerThread; 
  7. import android.os.Looper; 
  8. import android.os.Message; 
  9. import android.util.Log; 
  10.  
  11. public class HandlerActivity extends Activity { 
  12.      
  13.     private Handler handler = new Handler(); 
  14.      
  15.     @Override 
  16.     public void onCreate(Bundle savedInstanceState) { 
  17.         super.onCreate(savedInstanceState); 
  18.         //handler.post(r); 
  19.         setContentView(R.layout.main); 
  20.         Log.e("activity-->" ,Thread.currentThread().getId() + ""); 
  21.         Log.e("activityname-->" ,Thread.currentThread().getName() + ""); 
  22.         
  23.         //與主線程同一線程 
  24.         handler.post(r); 
  25.          
  26.         //與主線程不同線程 
  27.         HandlerThread handlerThread = new HandlerThread("handler_thread"); 
  28.         handlerThread.start(); 
  29.         //HandlerThread線程對象要啟動後, 
  30.         //通過handlerThread.getLooper()方法才能獲得Looper對象 
  31.         MyHandler myHandler = new MyHandler(handlerThread.getLooper()); 
  32.         Message msg  = myHandler.obtainMessage(); 
  33.         msg.sendToTarget();  //發送訊息的方式 
  34.     } 
  35.      
  36.     //建立一個線程對象 
  37.     Runnable r = new Runnable() { 
  38.          
  39.         @Override 
  40.         public void run() { 
  41.             Log.e("handler-->" ,Thread.currentThread().getId() + ""); 
  42.             Log.e("handlername-->" ,Thread.currentThread().getName() + ""); 
  43.             try{ 
  44.                 Thread.sleep(10*1000); 
  45.             }catch(InterruptedException e){ 
  46.                 e.printStackTrace(); 
  47.             } 
  48.         } 
  49.     }; 
  50.      
  51.     //建立Handler對象 
  52.     class MyHandler extends Handler{ 
  53.          
  54.         public MyHandler(){ 
  55.              
  56.         } 
  57.          
  58.         public MyHandler(Looper looper){ 
  59.             super(looper); 
  60.         } 
  61.  
  62.         @Override 
  63.         public void handleMessage(Message msg) { 
  64.             Log.e("handler-->" ,Thread.currentThread().getId() + ""); 
  65.             Log.e("handler-->" ,Thread.currentThread().getName() + ""); 
  66.         } 
  67.          
  68.     } 

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對象方式才是開啟了一個新的線程去執行程式。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.