Handler原理分析
来源:互联网 发布:阿里云如何更换公网ip 编辑:程序博客网 时间:2024/06/05 14:54
Looper:
如下两个方法都是系统调用的 先是调用了prepareMainLooper() 然后调用loop()
prepareMainLooper() 主线程中创建的 安卓环境调用的
prepare(boolean quitAllowed) 创建了一个线程安全的对象
在该对象的内部 创建一个名叫mQueue的MessageQueue对象
sMainLooper = myLooper();
该myLooper()就是从主线程中提取的当前的Looper对象
loop()
等.....
Handler:
1.在主线程中new出来的对象
Handler()
Handler(Callback callback, boolean async)
mLooper = Looper.myLooper();
拿到当前主线程的Looper对象
mQueue = mLooper.mQueue;
拿到Looper的mQueue 作为自己的mQueue
2.在子线程中调用了sendMessage(msg);
sendMessageDelayed(msg, 0);
sendMessageAtTime(msg, SystemClock.uptimeMillis() + delayMillis);
enqueueMessage(MessageQueue queue, Message msg, long uptimeMillis)//queue就是Looper的mQueue,而Message就是我们发送信息携带的Message
msg.target = this;//Message携带了一个target属性 它指向当前的Handler对象
return queue.enqueueMessage(msg, uptimeMillis);
MessageQueue:
enqueueMessage(msg, uptimeMillis);
Message p = mMessages;//在MeessageQueue里面有一个mMessages的全局变量
if (p == null || when == 0 || when < p.when) {//如果该全局变量是空的 说明我们第一次存Message
// New head, wake up the event queue if blocked.
msg.next = null;//将我们传进来的Message的下一个指向为null
mMessages = msg;//就将我们传进来的对象设置为mMessages
needWake = mBlocked;
} else {
// 如果我们之前已经发送了Message了(并且还没来得及处理)
Message prev;
for (;;) {
prev = p;//拿到全局变量 将当前需要发送的Meesage存储最后那个Message的next属性里
p = p.next;
if (p == null || when < p.when) {
break;
}
if (needWake && p.isAsynchronous()) {
needWake = false;
}
}
msg.next = p; // invariant: p == prev.next
prev.next = msg;
}
// We can assume mPtr != 0 because mQuitting is false.
if (needWake) {
nativeWake(mPtr);
}
}
-----------------------------------------sendMessage() 将信息传递到主线程的Looper对象的MessageQueue中-----------------------------------------------------
-----------------------------------------上面的分析中我们压根没处理信息 信息是如何被handleMessage()调用-----------------------------------------------------
Looper:
如下两个方法都是系统调用的 先是调用了prepareMainLooper() 然后调用loop()
prepareMainLooper() ....
loop()
final Looper me = myLooper(); //1.拿到主线程Looper对象
final MessageQueue queue = me.mQueue;//2.拿到自己的MessageQueue对象
for (;;) { //3.这里是个死循环 说明系统一直在跑这段代码
Message msg = queue.next(); //4.取出需要处理的信息
try {
//5.msg.target=拿到当初发送该信息的Handler 然后调用Handler的dispatchMessage
msg.target.dispatchMessage(msg);
} finally {
if (traceTag != 0) {
Trace.traceEnd(traceTag);
}
}
msg.recycleUnchecked();
}
Handler:
dispatchMessage(Message msg)
handleMessage(msg);
阅读全文
1 0
- Handler,Looper 原理分析
- Handler原理分析
- Android Handler原理分析
- Handler原理分析
- Handler原理分析
- Handler源码分析原理
- handler的原理分析
- Handler源码原理分析
- Handler,Looper,MessageQueue原理分析
- handler机制原理源码分析
- Handler机制的原理分析
- Handler系列之原理分析
- Handler系列之原理分析
- Handler 原理分析和使用
- android 消息机制 Handler Looper 原理分析
- android Handler 工作原理分析(一)
- Android Handler Looper MessageQueue原理分析
- Handler消息处理机制--原理分析
- 科普项:对 java 基础的总结
- 双目相机的畸变矫正及平行矫正
- webpack和npm
- Android设计模式之桥接模式
- system()功能
- Handler原理分析
- Java任务(温度转换,水仙花,阶乘求和)
- 彻底搞明白傅里叶变换的意义
- URL传值带加号“+”或者中文乱码的解决方法
- 从volatile关键字,窥java虚拟机内存冰山一角
- android计算程序运行耗时
- Day-04
- reverse-integer
- 微信小程序 请求返回:data format error hint