boolean enqueueMessage(Message msg, long when) { if (msg.target == null) { // 不允许发送target为null的消息,也就是说这个方法放不了同步屏障消息 throw new IllegalArgumentException("Message must have a target."); } synchronized (this) { if (msg.isInUse()) { throw new IllegalStateException...
publicvoiddispatchMessage(@NonNullMessagemsg){if(msg.callback!=null){// 1. post runnable 或者 Message 带 callback 会走到这里来handleCallback(msg);}else{// 2. 发送一个不带 callback 的 Message 会走到这里来// 3. 如果实例化 Handler 的时候传了 callback, 就在 callback 中处理消息if(mCallb...
我们默认用的都是同步消息,即前面讲Handler里的构造函数参数的async参数默认是false,同步消息在MessageQueue里的存和取完全就是按照时间排的,也就是通过msg.when来排的。异步消息异步消息就是在创建Handler如果传入的async是true或者发送来的Message通过msg.setAsynchronous(true);后的消息就是异步消息,异步消息的功能要...
当sendMessage 时,enququeMessage()@MessageQueue 会将消息按照按照实际执行时间顺序(即msg.when)插入到队列,然后执行nativeWake()唤醒,随后执行到next()@MessageQueue 中的nativePollOnce()处,这里是一个 for 死循环,唤醒后计算出根据now 和msg.when,如果now < msg.when 则计算出nextPollTimeoutMillis,下一个循环...
Handler.sendMessage(Msg) 方法是最为常见的一种方法。 2.1 使用步骤说明 其使用步骤分四步,如下所示: 步骤一:新建 Handler 对象,覆写 handleMessage(Message) 方法。 步骤二:新建 Message 对象,设置其携带的数据。 步骤三:在子线程中通过 Handler.sendMessage(Message) 方法发送信息。
private int postSyncBarrier(long when) {synchronized (this) {// 同步屏障可以建立多个,用计数的 Token 变量识别final int token = mNextBarrierToken++;// 获取一个屏障 Message// 其 target 属性为空// 指定 when 属性为屏障的开始时刻final Message msg = Message.obtain();msg.markInUse();msg.when ...
首先设置了Message的when字段,也就是代表了这个消息的处理时间 然后判断当前队列是不是为空,是不是即时消息,是不是执行时间when大于表头的消息时间,满足任意一个,就把当前消息msg插入到表头。 否则,就需要遍历这个队列,也就是链表,找出when小于某个节点的when,找到后插入。
插入(入队) enqueueMessage(Message msg, long when) 读取(出队) next() 1. 2. 查看enqueueMessage的源码: AI检测代码解析 boolean enqueueMessage(Message msg, long when) { if (msg.isInUse()) { throw new AndroidRuntimeException(msg + " This message is already in use."); } if (msg.target ...
msg.recycle(); return false; } msg.markInUse(); msg.when = when; Message p = mMessages; boolean needWake; if (p == null || when == 0 || when < p.when) { // New head, wake up the event queue if blocked. msg.next = p; ...
Log.i("HandlerActivity","子线程:handleMessage: ${msg.what}") } } } 这就是小伙伴们一般常用的两个用法。大家注意到了在第二个用法中出现了一个Looper.getMainLooper(),使用它作为参数,即使MyHandler是在子线程中定义的,但是它的handleMessage方法依然运行在主...