
Android MultiMedia框架——ALooper AHandler AMessage
基于Android 9.0源码分析
在分析meidacodec framework层代码有看到ALooper、AHandler、AMessage这几个类,这主要分析下其内部原理
代码路径:frameworks/av/media/libstagefright/foundation/
ALooper
首先看下ALooper使用示例
1 初始化
mRunningLocally用来区分ALooper执行线程是否在调用线程,start函数会进行复制;
清理过时的AHandler;
2 start
runOnCallingThread参数用来区分ALooper执行时在调用者线程还是新创建线程;
runOnCallingThread为ture,则在调用者线程进行loop循环;
runOnCallingThread为false,创建LooperThread,并调用其run方法;
接着看下LooperThread
LooperThread继承于Thread类,其run函数会调用到threadLoop函数中;
threadLoop会调用ALooper的loop函数,进行消息的分发;
3 loop
先看下ALooper类的一些变量
Event结构体封装了AMessage及对应的时间,mEventQueue则对应接收到的消息队列。
mEventQueue如果内部空,没有元素则进行阻塞等待;
mEventQueue不为空,则获取第一个元素的时间,如果时间大于当前时间则表示没有到时间,则阻塞指定时间并返回;
如果whenUs不大于当前时间,则表示应该执行第一个任务了;
取出第一个event,并从mEventQueue中擦除,执行message deliver函数,稍后分析deliver;
ALooper loop函数负责从mEventQueue获取事件,并进行分发;
AMessage
先看使用示例
接着看下AMessage内部实现
初始化AMessage,设置其what值,并且和handler、Looper绑定关系。
post获取ALooper指针,调用其post函数,将AMessage封装成Event,添加到mEventQueue队列中。
看下Amessage deliver函数,
deliver中获取AHandler指针,并将消息分发给AHandler处理;
AHandler
AHandler接收到消息,调用onMessageReceived函数进行处理,类似java 中handleMessage。
C++层和java层区别(AHandler 和Handler区别)
- 都实现了线程间通信机制
- ALooper在start时,确定其执行线程是在调用者线程,还是新建线程,而Looper则在初始化(prepare)时确定其执行线程为本线程;
- C++层发送消息可以等待获取回应,java层不能阻塞获取回应。
————————————————
版权声明:本文为博主「zpy_公众号_码农修仙儿」的原创文章
