刚开始接触android,边学习边做笔记,希望大家多指正。
经常在代码中看到sendMessage()族的一些函数,开始时总搞不明白消息发送到哪里去了,谁去处理,什么时候处理。下面是问题解答。
android中有几个概念:消息Message、消息队列MessageQueue、Looper对象。在创建Looper对象(构造函数中)时,会相应产生一个消息队列;sendMessage()函数会将消息放入到该函数所在线程对应的Looper的消息队列中(一个线程最多有一个Looper),Looper会不断地从消息队列中取出消息并处理,处理消息的实现在handleMessage(Message msg)中;那handleMessage函数去哪里看呢?首先找到sendMessage或是post函数族的发出者Handler,如myHandler.sendMessage(XX),那么我们需要找到myHandler的类型,假设为SHandler类,那么就去SHandler类中寻找handleMessage方法。因此在编写程序时,我们创建的handler类在继承Handler的同时,需要重写Handler的handleMessage方法。
至于开始的几个疑问,我是这样理解的。消息发送出去,就相当于马上要被处理了。就像进地铁一样,已经站到了进站的队列中(假设每个地铁站仅一个地铁口和进站队列),地铁口的工作人员一直处于工作状态,类似于这里的Looper,不同的地铁站类似于不同的Handler对象,它们均有自己的工作人员Looper和进站队列MessageQueue。
Handler myhandler=new Handler(){
@Override
public void HandleMessage(Message msg)
{
super.HandleMessage(msg);
switch(msg.what){
case 0:
fun();
break;
default:
break;
}
}
}
private void sendMessageDemo(){
new Thread(new Runnable(){
@Override
public void run(){
Message msg=handler.obtainMessage();
myHandler.sendMessage(msg);
}
}).start();
}
private void postDemo(){
new Thread(newRunnable(){
@Override
public void run(){
myHandler.post(new Runnable(){
@Override
public void run(){
fun();
}
});
}
}).start();
}
向消息队列中发送消息的方法有:
sendEmptyMessage(int)//发送消息
sendMessage(Msg)
sendMessageAtTime(Msg,long)
sendMessageDelayed(Msg,long)
post(Runnable)//提交计划任务
postAtTime(Runnable,long)
postDelayed(Runnable,long)
其中,sendMessage族和post族区别仅在于编码实现的方式不同,而原理的本质是一样的。