Stagefright框架ALooper/AHandler/AMessage消息队列机制

本文引自:

https://www.jianshu.com/p/b3217fbe6e56

https://blog.csdn.net/harman_zjc/article/details/53397945

https://blog.csdn.net/shisi/article/details/50451489

 

作为一只小菜鸟,在阅读到Android MediaPlayer相关的Nuplayer代码的时候,发现函数的调用不再是A call B了,阅读起来比较痛苦。

究其原因,是因为采取了一种消息传递机制来控制流程。对于熟悉多线程的童鞋来说,这个并不复杂,也可以说很简单。但是对于我这种刚刚接触Android、多线程的小菜鸟来说,还是值得研究一下的。

 

AMessage、AHandler、ALooper是什么?

AMessage类:

消息类,用于构造消息,并通过post方法投递出去由ALooperRoster 类中转给ALooper

ALooperRoster类:

中转类,将消息中转给ALooper 或者 AHandleReflector

ALooper:

与AHandle一一对应,负责存储和转发AHandle的消息

LooperThread:

此线程循环调用ALooper的loop方法来转发消息

 

这里,还需要明确两点概念:

  1. 一个ALooper消息队列中可以有多个AHandler注册其中,但是一个AHandler不能注册在多个ALooper下
  2. ALooper启动后(线程启动),会不断轮询,有AMessage,就抛给指定的AHandler处理。并且在发现自己的消息队列中没有任何消息时,会等待,不会一直跑,从而降低CPU的占用率

 

消息队列处理流程:

 

三者之间关系:

利用ALooper进行消息传递即处理涉及到的类关系图如下:

 

 

相关接口

 

ALooper::post();

发异步消息,可以指定延时时间delayUs

postAndAwaitRespone()

发同步消息

postReply()

同步回消息

senderAwaitsResponse()

 

AHander::onMessageReceived()

由各个继承于AHandler的类实现

registerHandler()

AHandler和Alooper进行绑定

start()

启动looper

 

 

 

消息机制分析

AMessage从发送到处理流程

1)异步消息,不需要等待执行结果

post()到ALooper后,会把AMessage插入到mEventQueue队列中,此时把Message封装到Event中。

上面的post()后,会把Event(AMessage)插入event队列中,如果插在头部,会发一次信号到loop()中。

 

收到信号后,mQueueChangedCondition.waitRelative()会返回true,重新跑一次loop(),这时如果队列中的第一个消息需要马上处理(whenUs > nowUs 不成立),会继续往下跑,从队列中取出第一个消息,并从队列移除,调用event.mMessage->deliver();就走到了后面AHandler的消息处理流程。

 

2)同步消息,需要等待消息处理完成之后才返回

和异步消息的流程差不多,只不过多了等带AHandler处理完消息后并postReply()后才会往下走,并且得到一个AMessage类型返回结果。AMessage可以保存很多类型的数据,通过的形式,在传递参数时,使用起来十分方便。

 

 

源代码分析:

 

ALooper:

https://www.jianshu.com/p/9da9a2f7ec21

AHandler:

https://www.jianshu.com/p/2624f3f629e0

AMessage:

https://www.jianshu.com/p/408521fbcb64

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值