Android消息处理

来源:互联网 发布:电脑锣编程软件有什么 编辑:程序博客网 时间:2024/05/21 04:42

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_tAlooper::start(priority)

{

   mThread =newLooperThread();

   err = mThread->run(priority);   

}


Alooper::handler_idAlooper::registerHandler(handler)

{

   return gLooperRoster.registerHandler(this,handler);

}


Alooper::handler_idALooperRoster::registerHandler()

{

   handler->setID(handlerID); //给每个Ahandler分配一个handler_id,0开始++

}


//loop当线程run的时候会一直执行

BoolAlooper::loop()

{

   event = *mEventQueue.begin();

   event.mMessage->deliver();

}


void AMessage::deliver()

{

   sp<AHandler> handler = mHandler.promote();

   handler->deliverMessage(this);

}


//sample code

{

   msg =newAmessage(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());

}

0 0
原创粉丝点击