Handler 为Android操作系统中的线程通信工具,包为android.os.Handler。

与Handler绑定的有两个队列,一个为消息队列,另一个为线程队列。Handler可以通过这两个队列来分别:

  1. 发送、接受、处理消息–消息队列;
  2. 启动、结束、休眠线程–线程队列;

Android OS中,一个进程被创建之后,主线程(可理解为当前Activity)创建一个消息队列,这个消息队列维护所有顶层应用对象(Activities, Broadcast receivers等)以及主线程创建的窗口。你可以在主线程中创建新的线程,这些新的线程都通过Handler与主线程进行通信。通信通过新线程调用 Handler的post()方法和sendMessage()方法实现,分别对应功能:

  1. post()  将一个线程加入线程队列;
  2. sendMessage() 发送一个消息对象到消息队列;

当然,post()方法还有一些变体,比如postDelayed()、postAtTime()分别用来延迟发送、定时发送;

消息的处理,在主线程的Handler对象中进行;具体处理过程,需要在new Handler对象时使用匿名内部类重写Handler的handleMessage(Message msg)方法;

线程加入线程队列可以在主线程中也可以在子线程中进行,但都要通过主线程的Handler对象调用post()。

下面我以一个进度条Demo来展示Handler的使用,每隔2000ms就使进度条进一格,先预览下程序结构图:


[1] main.xml中的布局文件源码如下:


view plain 
  
 
 
1. <?xml version="1.0" encoding="utf-8"?>  
2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
3. android:orientation="vertical"  
4. android:layout_width="fill_parent"  
5. android:layout_height="fill_parent"  
6. >  
7. <TextView    
8. android:layout_width="fill_parent"   
9. android:layout_height="wrap_content"   
10. android:textSize="16sp"  
11. android:text="Hello , This is Andy's blog !"/>  
12. <Button  
13. android:id="@+id/start"  
14. android:layout_width="fill_parent"  
15. android:layout_height="wrap_content"  
16. android:text="Start"/>  
17. <Button  
18. android:id="@+id/end"  
19. android:layout_width="fill_parent"  
20. android:layout_height="wrap_content"  
21. android:text="End"/>    
22. <ProgressBar  
23. android:id="@+id/pBar"  
24. android:layout_width="fill_parent"  
25. android:layout_height="wrap_content"  
26. style="?android:attr/progressBarStyleHorizontal"  
27. mce_style="?android:attr/progressBarStyleHorizontal"  
28. android:visibility="gone"/>  
29. </LinearLayout>

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


view plain 
  
 
 
1. package com.andyidea.handlerdemo;  
2.   
3. import android.app.Activity;  
4. import android.os.Bundle;  
5. import android.os.Handler;  
6. import android.os.Message;  
7. import android.util.Log;  
8. import android.view.View;  
9. import android.widget.Button;  
10. import android.widget.ProgressBar;  
11.   
12. public class HandlerActivity extends Activity {  
13.       
14.     Button btnStart,btnEnd;  
15.     ProgressBar proBar;  
16.       
17.     /** Called when the activity is first created. */  
18.     @Override  
19.     public void onCreate(Bundle savedInstanceState) {  
20.         super.onCreate(savedInstanceState);  
21.         setContentView(R.layout.main);  
22.           
23.         //通过控件的ID来实例化控件对象  
24. btnStart = (Button)findViewById(R.id.start);  
25. btnEnd = (Button)findViewById(R.id.end);  
26. proBar = (ProgressBar)findViewById(R.id.pBar);  
27.           
28.         //开始按钮触发事件  
29.         btnStart.setOnClickListener(new View.OnClickListener() {  
30.               
31.             @Override  
32.             public void onClick(View v) {  
33.                 proBar.setVisibility(View.VISIBLE);  
34.                 updateBarHandler.post(updateBarThread);  
35.             }  
36.         });  
37.           
38.         //结束按钮触发事件  
39.         btnEnd.setOnClickListener(new View.OnClickListener() {  
40.               
41.             @Override  
42.             public void onClick(View v) {  
43.                 updateBarHandler.removeCallbacks(updateBarThread);  
44.             }  
45.         });  
46.     }  
47.       
48.       
49.      //创建一个Handler对象  
50. updateBarHandler = new Handler(){  
51.   
52.         @Override  
53.         public void handleMessage(Message msg) {  
54.             proBar.setProgress(msg.arg1);  
55.             updateBarHandler.post(updateBarThread);  
56.         }  
57.           
58.     };  
59.       
60.     //更新ProgressBar的线程对象  
61. updateBarThread = new Runnable() {  
62. i = 0;  
63.         @Override  
64.         public void run() {  
65. ii = i + 10;  
66. msg = updateBarHandler.obtainMessage();  
67. msg.arg1 = i;  
68.             try{  
69.                 Thread.sleep(2000);  
70.             }catch (InterruptedException e) {  
71.                 e.printStackTrace();  
72.             }  
73.             updateBarHandler.sendMessage(msg);  
74. i == 100){  
75.                 updateBarHandler.removeCallbacks(updateBarThread);  
76.             }  
77.         }  
78.     };  
79. }


程序运行的截图如下:

android json post 接收 android handler post_android

注:在主线程Han

dlerActivity中,通过Handler对象将updateBarThread子线程对象添加到主线程的队列中,并不是另外开启了一个新的线程去执行。

注意:

Handler是绑定到创建它的主线程中的,Handler跟UI主线程是同一个线程。Handler的作用:主要是在其他后台线程中,通过handler这个媒介,向UI主线程发送Runnable对象(即代码段)
handler.post(Runnable),而这个方法,内部会执行下面的方法,从而把Runnable设置为Message.callback,实际上相当于handler.sendMessage(),只是发送了一个消息,

private static Message getPostMessage(Runnable r) {
         Message m = Message.obtain();
         m.callback = r;
         return m;
     }


handler.dispatch()的时候,会调用下面的方法
message.callback.run();
就是直接调用的Runnable的run方法,并不是strat(),所以仅仅是当做一个有run()的普通类使用而已,并不是开启了一个新的线程