Handler消息处理类
Handler()或Handler(Looper)
sendMessage(Message)
给消息队列发送消息
obtainMessage()
从消息队列中获取消息
post(Runnable)
消息提交给线程处理
handleMessage
在消息循环中,被调用的消息处理函数
1、Handler: 消息的处理者,handler负责将需要传递的信息封装成Message,通过调用handler对象的obtainMessage()来实现;
将消息传递给Looper,这是通过handler对象的sendMessage()来实现的。继而由Looper将Message放入MessageQueue中。
当Looper对象看到MessageQueue中含有Message,就将其广播出去。该handler对象收到该消息后,调用相应的handler对象的handleMessage()方法对其进行处理。
-------------------------------------------------------------------------------
Looper类(管理消息队列和消息循环)
static Looper myLooper():获得当前线程的Looper对象
static Looper getMainLooper():获得应用程序主线程的 Looper 对象
prepare
消息队列初始化,产生一个looper(针对无消息循环队列的线程),这个方法为该线程创建了一个 Looper 对象,同时也创建了 MessageQueue 消息队列
loop
进入消息队列循环处理
1、Looper类用来为一个线程开启一个消息循环,是用来封装消息循环和消息队列的一个类
(1)默认情况下android中新诞生的线程是没有开启消息循环的。(主线程除外,主线程系统会自动为其创建Looper对象,开启消息循环。) (2)Looper对象通过MessageQueue来存放消息和事件。一个线程只能有一个Looper,对应一个MessageQueue。
(3)Looper是MessageQueue的管理者。每一个MessageQueue都不能脱离Looper而存在,Looper对象的创建是通过prepare函数来实现的。同时每一个Looper对象和一个线程关联。通过调用Looper.myLooper()可以获得当前线程的Looper对象,创建一个Looper对象时,会同时创建一个MessageQueue对象。除了主线程有默认的Looper,其他线程默认是没有MessageQueue对象的,所以,不能接受Message。如需要接受,自己定义一个Looper对象(通过prepare函数),这样该线程就有了自己的Looper对象和MessageQueue数据结构了。Looper从MessageQueue中取出Message后,交由Handler的handleMessage进行处理。处理完成后,调用Message.recycle()将其放入Message Pool中。
其它线程向主线程发送消息,并更新主线程 UI 的内容
1 //主线程Handler 2 Handler myHandler = new Handler() 3 { 4 @Override 5 public void handleMessage(Message msg) 6 { 7 switch (msg.what) 8 { 9 case VALIDATION: 10 11 system.out.println("收到消息"); 12 13 break; 14 15 default: 16 break; 17 } 18 } 19 }; 20 21 22 23 //子线程 24 loginBtn.setOnClickListener(new OnClickListener() 25 { 26 27 @Override 28 public void onClick(View v) 29 { 30 Thread thread = new Thread() 31 { 32 @Override 33 public void run() 34 { 35 try 36 {sleep(1000);} 37 catch (InterruptedException e) 38 {e.printStackTrace();} 39 40 Message msg = Message.obtain(myHandler); 41 //构建Message对象,从主线程的全局消息池中得到一个 Message 42 //第一个参数:是自己指定的message代号,方便在Handler选择性地接收 43 //第二三个参数没有什么意义 44 //第四个参数需要封装的对象 45 //Message msg = mHandler.obtainMessage(1, 1, 1, ("我是子线程发的消息内容" + i)); 46 msg.what = VALIDATION; 47 myHandler.sendMessage(msg); 48 } 49 }; 50 thread.start(); 51 52 } 53 } 54 });
主线程向其它线程发送消息,其它线程又将信息返回给主线程,并更新主线程 UI 的内容
1 public class LooperDemo3 extends Activity 2 { 3 private Button btnLooperDemo3_Start; 4 private TextView tvLooperDemo3_Show; 5 private Handler mainThreadHandler, otherThreadHandler; 6 private static int count = 1; 7 8 @Override 9 protected void onCreate(Bundle savedInstanceState) 10 { 11 super.onCreate(savedInstanceState); 12 setContentView(R.layout.looperdemo3); 13 //初始化组件 14 initComponent(); 15 //注册监听 16 registerListener(); 17 } 18 19 /** 20 * 21 * 函数名称 : initComponent 22 * 功能描述 : 初始化组件 23 * 参数及返回值说明: 24 * 25 * 修改记录: 26 * 日期 :2012-2-10 下午4:14:57 修改人:gy 27 * 描述 : 28 * 29 */ 30 private void initComponent() 31 { 32 btnLooperDemo3_Start = (Button)findViewById(R.id.btnLooperDemo3_Start); 33 tvLooperDemo3_Show = (TextView)findViewById(R.id.tvLooperDemo3_Show); 34 //实例化一个 OtherThread 线程,并启动线程 35 new OtherThread().start(); 36 } 37 38 /** 39 * ********************************************************** 40 * 内容摘要 :其它线程类<p> 41 * 42 * 作者 :kyx 43 * 创建时间 :2012-2-13 下午4:57:43 44 * 当前版本号:v1.0 45 * 历史记录 : 46 * 日期 : 2012-2-13 下午4:57:43 修改人: 47 * 描述 : 48 *********************************************************** 49 */ 50 class OtherThread extends Thread 51 { 52 53 @Override 54 public void run() 55 { 56 //创建该线程的Looper对象,用于接收消息 ,同时也创建了一个消息队列 57 Looper.prepare(); 58 //只要调用了 Looper.prepare() 方法后,这时该线程的Looper对象才会存在,同时会创建一个消息队列。接着才能去实例化 Handler 对象 59 //这里Looper.myLooper()获得的就是该线程的Looper对象 60 otherThreadHandler = new OtherThreadHandler(Looper.myLooper()); 61 //Looper.loop():其实就是一个循环,循环从MessageQueue中取消息 62 Looper.loop(); 63 } 64 } 65 66 /** 67 * 68 * 函数名称 : registerListener 69 * 功能描述 : 注册监听 70 * 参数及返回值说明: 71 * 72 * 修改记录: 73 * 日期 :2012-2-10 下午4:15:30 修改人:gy 74 * 描述 : 75 * 76 */ 77 private void registerListener() 78 { 79 //开始 80 btnLooperDemo3_Start.setOnClickListener(new OnClickListener() 81 { 82 @Override 83 public void onClick(View v) 84 { 85 //构造消息,从其它线程的全局消息池中得到一个 Message 86 Message message = otherThreadHandler.obtainMessage(1, 1, 1, "这些内容是从主线程发来的!!!"); 87 //通过 otherThreadHandler,将消息发送到其它线程,也就是将消息传递给实例化 otherThreadHandler 的 Looper, 88 //就是将消息放入其它线程的消息队列中 89 otherThreadHandler.sendMessage(message); 90 } 91 }); 92 } 93 94 /** 95 * ********************************************************** 96 * 内容摘要 :MainThreadHandler类,主线程的 Handler,用于接收从子线程发回来的消息,并将消息内容用于更新主线程的 UI 内容<p> 97 * 98 * 作者 :kyx 99 * 创建时间 :2012-2-13 下午3:40:36 100 * 当前版本号:v1.0 101 * 历史记录 : 102 * 日期 : 2012-2-13 下午3:40:36 修改人: 103 * 描述 : 104 *********************************************************** 105 */ 106 class MainThreadHandler extends Handler 107 { 108 public MainThreadHandler(Looper looper) 109 { 110 super(looper); 111 } 112 113 114 @Override 115 public void handleMessage(Message msg) 116 { 117 super.handleMessage(msg); 118 System.out.println("=====MainThreadHandler tvLooperDemo3_Show.setText之前====="); 119 //修改主线程的 UI 内容 120 tvLooperDemo3_Show.setText("我是主线程的 Handler,收到了非主线程的消息:" + (String)msg.obj); 121 System.out.println("=====MainThreadHandler tvLooperDemo3_Show.setText之后====="); 122 } 123 } 124 125 /** 126 * ********************************************************** 127 * 内容摘要 :OtherThreadHandler类,其它线程的 Handler,用于接收从主线程发来的消息,并将消息内容再转发给主线程<p> 128 * 129 * 作者 :kyx 130 * 创建时间 :2012-2-13 下午3:40:36 131 * 当前版本号:v1.0 132 * 历史记录 : 133 * 日期 : 2012-2-13 下午3:40:36 修改人: 134 * 描述 : 135 *********************************************************** 136 */ 137 class OtherThreadHandler extends Handler 138 { 139 public OtherThreadHandler(Looper looper) 140 { 141 super(looper); 142 } 143 144 145 @Override 146 public void handleMessage(Message msg) 147 { 148 super.handleMessage(msg); 149 //收到是主线程发送过来的消息 150 System.out.println("what=" + msg.what + " arg1=" + msg.arg1 + " arg2=" + msg.arg2 + " obj=" + (String)msg.obj); 151 System.out.println("=====OtherThreadHandler handleMessage sendMessage之前====="); 152 //主线程的 Handler 153 mainThreadHandler = new MainThreadHandler(Looper.getMainLooper()); 154 //创建一个新的消息对象 155 Message msgModify = mainThreadHandler.obtainMessage(1, 1, 1, "子线程修改的消息:[" 156 + (count++) 157 + "]" 158 + (String)msg.obj); 159 //通过主线程的 Handler 将消息发送给主线程 160 boolean bl = mainThreadHandler.sendMessage(msgModify); 161 System.out.println("=====OtherThreadHandler handleMessage sendMessage之后===== bl=" + bl); 162 } 163 } 164 }