标签:android开发 安卓通信 looper messagequeue handler
Android开发中,Handler用的非常多,因为它和AsyncTask一样是系统提供给我们的异步的通信机制。能够将一些更新和别的不适合放在UI主线程的操作放到它们中去。
Handler的作用主要有两个:一是在线程中发送消息, 二是获取和处理消息。既可以发送消息sendEmptyMessage(int what) ,也可以发送指定的消息sendMessage(Message msg),还可以利用msg.obj的属性去传递我们需要的参数甚至对象,使原本的通信机制更为强大。
Handler的出现,解决了在非UI主线程更新UI组件数据的问题。如上面提到的,我们使用handler.sendEmptyMessage(int what) 或者 sendMessage(Message msg)去发送消息,这个消息就会放去消息队列MessageQueue中,MessageQueue是个先进先出的队列,Handler按照这个顺序一直从消息队列MessageQueue中获取消息Message,并且按照约定的方式去处理这些消息。下面是最简单的发送空消息给handler去进行处理:
private Handler handler = new Handler(){ @Override public void handleMessage(Message msg) { if(msg.what == 0x101) { //约定如何处理不同的msg消息 Log.i("print handler message", "msg.what = 0x101"); } else if(msg.what == 0x201) { Log.i("print handler message", "msg.what = 0x201"); } } }; /** * 发送空消息 */ private void sendMessageA() { handler.sendEmptyMessage(0x101); } private void sendMessageB() { handler.sendEmptyMessage(0x201); }使用Handler的过程中,想必大家都会发现,如果在UI主线程中直接使用Handler去发送消息是没问题的,但放在非主线程中就会报错了。为什么呢?
还是用上面的例子,不过改成在子线程中去创建Handler并且处理。
{ private Handler mHandler; @Override public void run() { // 创建Looper Looper.prepare(); mHandler = new Handler(){ @Override public void handleMessage(Message msg) { if(msg.what == 0x101) { //约定如何处理不同的msg消息 Log.i("print handler message", "msg.what = 0x101"); } else if(msg.what == 0x201) { Log.i("print handler message", "msg.what = 0x201"); } } }; //启动Looper,这样它才能从消息队列中读取管理消息 Looper.loop(); } } private void sendMessgeInThread() { MessageThread mThread = new MessageThread(); //创建Handler mThread.start(); mThread.mHandler.sendEmptyMessage(0x101); }
从上面分个的来说明,我们已经知道Handler,Looper和MessageQueue分别的作用是什么。这里就总结下它们三者的关系:
创建Handler ----> 使用handler发送消息 ---> 消息被放入消息队列MessageQueue中 ----> (主线程自动创建的)Looper负责不断地从消息队列中取出消息,交给Handler ---> Handler再次对不同的消息进行处理 ---> 消息message被处理完后,随即被扔弃毁掉,然后继续处理第二条到达的消息message,直到Looper已经将所有消息都读取完。
在上面的基础上分别调用Looper.prepare() 和 Looper.loop()方法去创建和启动Looer。创建Handler前调用Looper.prepare() ,创建完毕使用Looper.loop()。 剩下的收发消息和处理消息的过程和情况一是一样的。
简析Handler、Looper和MessageQueue三者的关系
标签:android开发 安卓通信 looper messagequeue handler
原文地址:http://blog.csdn.net/stzy00/article/details/44839193