行业知识
Android 消息机制之消息类型及同步屏障
2026-11-09 19:34:52
来源:互联网转载
1.Message消息分类
Handler的Message消息分为3种:普通消息(同步消息)、屏障消息(同步屏障)、异步消息。
通常Handler使用的都是默认普通消息,而屏障消息就是在消息队列中插入一个屏障,在屏障之后的所有普通消息都会被挡着,不能被处理。但是异步消息却例外,屏障不会挡住异步消息。因此可以理解为:屏障消息就是为了确保异步消息的优先级,设置了屏障后,只能处理其后的异步消息,同步消息会被挡住,除非撤销屏障。
2.发送异步消息
一般使用Handler发消息时都是同步消息,要发送异步消息有两种方式:
①通过Handler实现
Handler的构造方法中有个async参数,默认的构造方法中此参数为false,如果想发送异步消息,需要在创建Handler时使用以下构造函数并把async赋值为true。
public Handler(boolean async) { this(null, async); } ②通过Message实现
在创建Message对象时,直接调用Message的setAsynchronous()方法。
public void setAsynchronous(boolean async) { if (async) { flags |= FLAG_ASYNCHRONOUS; } else { flags &= ~FLAG_ASYNCHRONOUS; } } 在一般情况下异步消息和同步消息没有什么区别,但是一旦开启了同步屏障以后就有区别了。
2.发送屏障消息
屏障消息(同步屏障)是通过MessageQueue的postSyncBarrier()方法插入到消息队列的。
public int postSyncBarrier() { return postSyncBarrier(SystemClock.uptimeMillis()); }
public int postSyncBarrier() { return postSyncBarrier(SystemClock.uptimeMillis()); } private int postSyncBarrier(long when) { // Enqueue a new sync barrier token. // We don't need to wake the queue because the purpose of a barrier is to stall it. synchronized (this) { final int token = mNextBarrierToken++; final Message msg = Message.obtain(); msg.markInUse(); msg.when = when; msg.arg1 = token; Message prev = null; Message p = mMessages; if (when != 0) { while (p != null && p.when
上一篇:怎么开支付宝商户?