Android消息处理

本文介绍了Android中的消息处理,Alooper如何创建线程并管理messagequeue,Ahandler如何创建和传递Amessage,以及ALooperRoster如何区分并处理不同消息。重点讲解了MediaCodec在视频和音频处理中对ALooper的使用,并指出消息顺序执行的重要性,对于延迟问题的分析提供了思路。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Alooper负责创建线程

Ahandler负责创建Amessage消息并透过ALooperRoster传给Alooper放到messagequeue

Alooperrun方法不停执行,从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());

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值