Alooper负责创建线程
Ahandler负责创建Amessage消息并透过ALooperRoster传给Alooper放到messagequeue
Alooper的run方法不停执行,从messagequeue里面获取第一个消息,通过ALooperRoster再返回给Ahandler处理。
ALooperRoster负责将所有消息区分开然后再丢回给对应的Ahandler来处理
struct CodecBase : public AHandler
struct ACodec: public CodecBase
//MediaCodec.cpp
mCodec = new ACodec;
if (mIsVideo) {
if (mCodecLooper == NULL) {
mCodecLooper = new ALooper;
mCodecLooper->setName("CodecLooper");
mCodecLooper->start(false, false, ANDROID_PRIORITY_AUDIO);
}
mCodecLooper->registerHandler(mCodec);
} else {
mLooper->registerHandler(mCodec);
}
mLooper->registerHandler(this);
在实例化MediaCodec对象的时候,AP会带一个ALooper,初始化给mLooper.
在MediaCodec init()的时候,若是Video,则会创建一个ALooper给mCodec使用。
若是Audio,则使用跟MediaCodec同一个ALooper.
另外MediaCodec对外标准接口,则是使用的AP的thread.
对于每一个thread,其消息在loop里面顺次执行,前一个执行完,后一个才能继续。有时候消息响应慢,可以从这个角度来分析,是不是前一个消息被卡住了。
Status_t Alooper::start(priority)
{
mThread =new LooperThread();
err = mThread->run(priority);
}
Alooper::handler_id Alooper::registerHandler(handler)
{
return gLooperRoster.registerHandler(this,handler);
}
Alooper::handler_id ALooperRoster::registerHandler()
{
handler->setID(handlerID); //给每个Ahandler分配一个handler_id,从0开始++
}
//该loop当线程run的时候会一直执行
Bool Alooper::loop()
{
event = *mEventQueue.begin();
event.mMessage->deliver();
}
void AMessage::deliver()
{
sp<AHandler> handler = mHandler.promote();
handler->deliverMessage(this);
}
//sample code
{
msg =new Amessage(uint32_t what, const sp<const AHandler> &handler);
msg->post();
}
Void Amessage::post()
{
sp<ALooper> looper = mLooper.promote();
looper->post();
}
Void MediaCodec::onMessageReceived(const sp<AMessage> &msg)
{
switch(msg->what());
}