一、android的消息机制
Q:UI线程为什么设计为单线程?
A:对于多线程的UI操作,如果UI线程在刷新界面的同时,非UI线程也在刷新界面,这就会造成多个界面的刷新不能同步,导致线程不安全。
android消息机制包含三部分:Message 、Handler、Looper(MessageQueue);
Message: 消息的载体,由几种属性:target、callback、arg1、arg2、when、what、data、obj。target为发送的目标、arg1、arg2、what为int型;when为long型;data为bundle;obj为Object。
Handler: 消息的处理者,负责消息的发送与处理。
Q :由多个Handler时怎么确定不会互相干扰
A:在发送消息过程中,调用了enqueueMessage(queue,msg, uptimeMillis)这个方法,
privatebooleanenqueueMessage(MessageQueue queue, Message msg, long uptimeMillis) {
msg.target = this;
if (mAsynchronous) {
msg.setAsynchronous(true);
}
return queue.enqueueMessage(msg,uptimeMillis);
}
为message的target设置了值,值为发送此消息的handler(这里为下面消息处理做好了一些准备工作,同时确保了消息由哪个handler发送,之后处理的时候也是那个handler处理)
Looper:在消息机制中Looper担当着消息的储存与转发的工作,它内部维护着一个消息队列MessageQueue,在实例化Looper的时候就会创建消息队列,一个线程中只能有一个Looper和一个消息队列。通过Loop.loop()不断从MessageQueue中查询消息。获取到了message之后loop方法中调用msg.target.dispatchMessage(msg),进行了转发工作。
Q:handler是怎么和MessageQueue建立的联系呢?
A:通过实例化handler对handler中的mLooper、mQueue 、mCallback 等赋初值,就将handler和MessageQueue、Looper建立了联系。
MessageQueue:存放消息队列。
结构图: