Android中Handler

本文通过例子来验证和说明使用Handler对象开启的线程是否和主线程为在同一线程中。

程序结构图如下:

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

  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.     } 

运行程序后,我们通过Logcat控制台的log.e输出可以看到结果如下:

通过验证,可以看到如果只是通过Handler对象的post()方法,只是把一个子线程对象放到主线程队列中,并不是开启了一个子线程。通过HandlerThread对象方式才是开启了一个新的线程去执行程序。

posted @ 2012-05-08 20:22  黎明&岁月  阅读(651)  评论(0编辑  收藏  举报