Handler和Message详解

Android开发中Handler的经典总结

 

当应用程序启动时,Android首先会开启一个主线程(也就是UI线程),主线程为管理界面中的UI控件,进行事件分发。安全

 

 

1、Handler的定义:app

主要接受子线程发送的数据, 并用此数据配合主线程更新UI。ide

解释:当应用程序启动时,Android首先会开启一个主线程 (也就是UI线程) , 主线程为管理界面中的UI控件, 进行事件分发, 好比说, 你要是点击一个 Button ,Android会分发事件到Button上,来响应你的操做。  若是此时须要一个耗时的操做,例如: 联网读取数据,    或者读取本地较大的一个文件的时候,你不能把这些操做放在主线程中,若是你放在主线程中的话,界面会出现假死现象, 若是5秒钟尚未完成的话,会收到Android系统的一个错误提示  "强制关闭"。  这个时候咱们须要把这些耗时的操做,放在一个子线程中,由于子线程涉及到UI更新,,Android主线程是线程不安全的, 也就是说,更新UI只能在主线程中更新,子线程中操做是危险的。 这个时候,Handler就出现了。,来解决这个复杂的问题 ,因为Handler运行在主线程中(UI线程中),  它与子线程能够经过Message对象来传递数据, 这个时候,Handler就承担着接受子线程传过来的(子线程用sedMessage()方法传弟)Message对象,(里面包含数据)  , 把这些消息放入主线程队列中,配合主线程进行更新UI。oop

2、Handler一些特色post

handler能够分发Message对象和Runnable对象到主线程中, 每一个Handler实例,都会绑定到建立他的线程中(通常是位于主线程),它有两个做用:this

(1)安排消息或Runnable 在某个主线程中某个地方执行;spa

(2)安排一个动做在不一样的线程中执行。线程

Handler中分发消息的一些方法对象

post(Runnable)blog

postAtTime(Runnable,long)

postDelayed(Runnable long)

sendEmptyMessage(int)

sendMessage(Message)

sendMessageAtTime(Message,long)

sendMessageDelayed(Message,long)

以上post类方法容许你排列一个Runnable对象到主线程队列中,

sendMessage类方法, 容许你安排一个带数据的Message对象到队列中,等待更新。

3、Handler实例

子类须要继承Hendler类,并重写handleMessage(Message msg) 方法, 用于接受线程数据。

如下为一个实例,它实现的功能为:经过线程修改界面Button的内容

  1. public class MyHandlerActivity extends Activity { 
  2.     Button button; 
  3.     MyHandler myHandler; 
  4.  
  5.     protected void onCreate(Bundle savedInstanceState) { 
  6.         super。onCreate(savedInstanceState); 
  7.         setContentView(R。layout。handlertest); 
  8.  
  9.         button = (Button) findViewById(R。id。button); 
  10.         myHandler = new MyHandler(); 
  11.         // 当建立一个新的Handler实例时, 它会绑定到当前线程和消息的队列中,开始分发数据 
  12.         // Handler有两个做用, (1) : 定时执行Message和Runnalbe 对象 
  13.         // (2): 让一个动做,在不一样的线程中执行。 
  14.  
  15.         // 它安排消息,用如下方法 
  16.         // post(Runnable) 
  17.         // postAtTime(Runnable,long) 
  18.         // postDelayed(Runnable,long) 
  19.         // sendEmptyMessage(int) 
  20.         // sendMessage(Message); 
  21.         // sendMessageAtTime(Message,long) 
  22.         // sendMessageDelayed(Message,long) 
  23.       
  24.         // 以上方法以 post开头的容许你处理Runnable对象 
  25.         //sendMessage()容许你处理Message对象(Message里能够包含数据,) 
  26.  
  27.         MyThread m = new MyThread(); 
  28.         new Thread(m)。start(); 
  29.     } 
  30.  
  31.     /** 
  32.     * 接受消息,处理消息 ,此Handler会与当前主线程一块运行 
  33.     * */ 
  34.  
  35.     class MyHandler extends Handler { 
  36.         public MyHandler() { 
  37.         } 
  38.  
  39.         public MyHandler(Looper L) { 
  40.             super(L); 
  41.         } 
  42.  
  43.         // 子类必须重写此方法,接受数据 
  44.         @Override 
  45.         public void handleMessage(Message msg) { 
  46.             // TODO Auto-generated method stub 
  47.             Log。d("MyHandler", "handleMessage。。。。。。"); 
  48.             super。handleMessage(msg); 
  49.             // 此处能够更新UI 
  50.             Bundle b = msg。getData(); 
  51.             String color = b。getString("color"); 
  52.             MyHandlerActivity。this。button。append(color); 
  53.  
  54.         } 
  55.     } 
  56.  
  57.     class MyThread implements Runnable { 
  58.         public void run() { 
  59.  
  60.             try { 
  61.                 Thread。sleep(10000); 
  62.             } catch (InterruptedException e) { 
  63.                 // TODO Auto-generated catch block 
  64.                 e。printStackTrace(); 
  65.             } 
  66.  
  67.             Log。d("thread。。。。。。。", "mThread。。。。。。。。"); 
  68.             Message msg = new Message(); 
  69.             Bundle b = new Bundle();// 存放数据 
  70.             b。putString("color", "个人"); 
  71.             msg。setData(b); 
  72.  
  73.             MyHandlerActivity。this。myHandler。sendMessage(msg); // 向Handler发送消息,更新UI 
  74.  
  75.         } 
  76.     } 
相关文章
相关标签/搜索