Handler/Message/Looper/MessageQueue。
-- 安卓为什么要设计Looper阻塞?
Android的应用程序和Windows应用程序一样,都是由消息驱动的。在Android操作系统中,谷歌也实现了消息循环处理机制。
1.Looper依赖于MessageQueue和Thread,每个Thread只对应一个Looper,每个Looper只对应一个MessageQueue(一对一)。
2.MessageQueue依赖于Message,每个MessageQueue中有N个待处理消息(一对N)。
3.Message依赖于Handler来进行处理,每个Message有且仅有一个对应的Handler。(一对一)
4.Handler中持有Looper和MessageQueue的引用,可直接对其进行操作。
5.Handler机制,即消息处理的机制,封装了一套消息创建、传递、处理机制。
-- 高级:NativeMessageQueue、 Native Looper
获取消息首先调用nativePollOnce,从底层epoll(异步阻塞IO),发送消息加入消息队列首先会调用nativeWake,向管道写入字符,唤醒IO,从而MessageQueue.next()可以返回一个Message。
-- handler 的原理是什么?()
从源码深入理解Android Handler异步消息处理机制- https://blog.youkuaiyun.com/wdmzszly/article/details/81941116
Android消息机制源码解析(Handler)- https://blog.youkuaiyun.com/Awenyini/article/details/78593139
首先是Handler/Message/Looper/MessageQueue这些对象的初始化,然后才是使用这些对象进行消息处理。
1、handler封装消息的发送(主要包括消息发送给谁);
2、Looper——消息封装的载体。(1)内部包含一个MessageQueue,所有的Handler发送的消息都走向这个消息队列;(2)Looper.Looper方法,就是一个死循环,不断地从MessageQueue取消息,如果有消息就处理消息,没有消息就阻塞;
3、MessageQueue,一个消息队列,添加消息,处理消息;
4、handler内部与Looper关联,handler->Looper->MessageQueue,handler发送消息就是向MessageQueue队列发送消息。
总结:handler负责发送消息,Looper负责接收handler发送的消息,并把消息回传给handler自己。MessageQueue存储消息的容器。
private Handler handler;
public void sendMsg() {//
//方法1
Message msg = new Message();
msg.what = 1;
msg.arg1 = 2;
msg.arg2 = 3;
msg.obj = "demo";
handler.sendMessage(msg);
//方法2
Message msg2 = handler.obtainMessage();
//obtainMessage();
//obtainMessage(what);
//obtainMessage(int what,Object obj);
//obtainMessage(int what,int arg1,int arg2);
//obtainMessage(int what,int arg1,int arg2,Object obj );
msg2.what = 1;
msg2.arg1 = 2;
msg2.arg2 = 3;
msg2.obj = "demo";
msg2.sendToTarget();
//方法3
Message msg3 = Message.obtain();
msg3.sendToTarget();
}
> Handler 消息机制
1. 在Looper.loop()方法运行开始后,循环地按照接收顺序取出Message Queue里面的非NULL的Message。
2. 一开始Message Queue里面的Message都是NULL的。当Handler.sendMessage(Message)到Message Queue,该函数里面设置了那个Message对象的target属性是当前的Handler对象。随后Looper取出了那个Message,则调用该Message的target指向的Hander的dispatchMessage函数对Message进行处理。
在dispatchMessage方法里,如何处理Message则由用户指定,三个判断,优先级从高到低:
1) Message里面的Callback,一个实现了Runnable接口的对象,其中run函数做处理工作;
2) Handler里面的mCallback指向的一个实现了Callback接口的对象,由其handleMessage进行处理;
3) 处理消息Handler对象对应的类继承并实现了其中handleMessage函数,通过这个实现的handleMessage函数处理消息。
由此可见,我们实现的handleMessage方法是优先级最低的!
> Handler的机制与源码分析,及自定义Handler
Android Handler源码级分析及自定义Handler实现- https://blog.youkuaiyun.com/liurenyou/article/details/72805916
Android消息机制Handler解析(源码+Demo)-- http://m.blog.youkuaiyun.com/article/details?id=51031331
Handler 源码分析-- http://blog.youkuaiyun.com/miraclemin/article/details/6556620
Android】从源码中探讨Handler机制-- http://blog.youkuaiyun.com/rongxinhua/article/details/20576185
假如在同一个Activity中,有多个线程同时更新UI,且没有加锁,那会导致什么问题呢?UI更新混乱。假如加锁呢?会导致性能下降。使用Handler机制,我们不用去考虑多线程的问题,所有更新UI的操作,都是在 主线程消息队列中轮询去处理的。]
> Handler 消息传递机制
message.sendToTarget();
/*1、message由handler创建,可直接向handler发送消息。msg.sendToTarget()*/
Message msg = handler.obtainMessage();
msg.arg1 = i;
msg.sendToTarget();
/*2、message通过new的方式创建,可用handler.sendMessage(msg)来发送消息*/
Message msg=new Message();
msg.arg1=i;
handler.sendMessage(msg);
//直接调用 handler 的发送消息方法发送消息。
/* 3、message通过Message.obtain的方式创建,可用sendMessage(msg)来发送消息 */
Message msg= Message.obtain();
msg.arg1=i;
handler.sendMessage(msg);
> Looper.getMainLooper()与Looper.myLooper();Looper.myLooper().quit(); Looper.getMainLooper().quit();
-- getMainLooper()
Returns the application's main looper, which lives in the main thread of the application.
-- myLooper()
Return the Looper object associated with the current thread. Returns null if the calling thread is not associated with a Looper.
boolean isUiThread = Looper.getMainLooper().getThread() == Thread.currentThread();
boolean isUiThread = Looper.getMainLooper().isCurrentThread();