AHandler and AMessages
来源:互联网 发布:windows文件夹监控 编辑:程序博客网 时间:2024/06/15 07:24
AHandler是Android native层实现的一个异步消息机制,在这个机制中所有的处理都是异步的,将变量封装到一个消息AMessage结构体中,然后放到队列中去,后台专门有一个线程会从这个队列中取出消息然后执行,执行函数就是onMessageReceived。
Ahandler机制包括以下几个类
AMessage
消息类,用于构造消息,通过post方法投递出去给ALooper
status_t AMessage::post(int64_t delayUs) { sp<ALooper> looper = mLooper.promote(); if (looper == NULL) { ALOGW("failed to post message as target looper for handler %d is gone.", mTarget); return -ENOENT; } looper->post(this, delayUs); return OK;}void AMessage::deliver() { sp<AHandler> handler = mHandler.promote(); if (handler == NULL) { ALOGW("failed to deliver message as target handler %d is gone.", mTarget); return; } handler->deliverMessage(this); //see AHandler@deliverMessage,前面通过looper post最后就是调用这里的deliever送到handler手里}
AHandler
消息处理类,一般当做父类,继承该类的子类需要实现onMessageReceived方法
void AHandler::deliverMessage(const sp<AMessage> &msg) { onMessageReceived(msg); mMessageCounter++;….}
ALooper
与Ahander一一对应,负责存储消息并分发Ahandler的消息,与AMessage一对多关系
// posts a message on this looper with the given timeoutvoid ALooper::post(const sp<AMessage> &msg, int64_t delayUs) { Mutex::Autolock autoLock(mLock); int64_t whenUs; if (delayUs > 0) { whenUs = GetNowUs() + delayUs; } else { whenUs = GetNowUs(); } List<Event>::iterator it = mEventQueue.begin(); while (it != mEventQueue.end() && (*it).mWhenUs <= whenUs) { ++it; } Event event; event.mWhenUs = whenUs; event.mMessage = msg; if (it == mEventQueue.begin()) { mQueueChangedCondition.signal(); } mEventQueue.insert(it, event);}----------------------------------------------------------status_t ALooper::start( bool runOnCallingThread, bool canCallJava, int32_t priority) { if (runOnCallingThread) { { Mutex::Autolock autoLock(mLock); if (mThread != NULL || mRunningLocally) { return INVALID_OPERATION; } mRunningLocally = true; } do { } while (loop()); return OK; } Mutex::Autolock autoLock(mLock); if (mThread != NULL || mRunningLocally) { return INVALID_OPERATION; } mThread = new LooperThread(this, canCallJava); status_t err = mThread->run( mName.empty() ? "ALooper" : mName.c_str(), priority); if (err != OK) { mThread.clear(); } return err;}bool ALooper::loop() { Event event; { Mutex::Autolock autoLock(mLock); if (mThread == NULL && !mRunningLocally) { return false; } if (mEventQueue.empty()) { mQueueChangedCondition.wait(mLock); return true; } int64_t whenUs = (*mEventQueue.begin()).mWhenUs; int64_t nowUs = GetNowUs(); if (whenUs > nowUs) { int64_t delayUs = whenUs - nowUs; mQueueChangedCondition.waitRelative(mLock, delayUs * 1000ll); return true; } event = *mEventQueue.begin(); mEventQueue.erase(mEventQueue.begin()); } event.mMessage->deliver(); //see AHandler.deliverMessage….. return true;}
LooperThread
此线程调用ALooper的loop方法来分发消息
virtual status_t readyToRun() { mThreadId = androidGetThreadId(); return Thread::readyToRun(); } virtual bool threadLoop() { return mLooper->loop(); }
ALooperRoaster
与Handler是一对多的关系, 管理Looper和Handler一一对应关系,负责释放stale handler
ALooper::handler_id ALooperRoster::registerHandler( const sp<ALooper> looper, const sp<AHandler> &handler) { Mutex::Autolock autoLock(mLock); if (handler->id() != 0) { CHECK(!"A handler must only be registered once."); return INVALID_OPERATION; } HandlerInfo info; info.mLooper = looper; info.mHandler = handler; ALooper::handler_id handlerID = mNextHandlerID++;//一对一 mHandlers.add(handlerID, info);//一对多 handler->setID(handlerID, looper); return handlerID;}
void ALooperRoster::unregisterHandler(ALooper::handler_id handlerID) { Mutex::Autolock autoLock(mLock); ssize_t index = mHandlers.indexOfKey(handlerID); if (index < 0) { return; } const HandlerInfo &info = mHandlers.valueAt(index); sp<AHandler> handler = info.mHandler.promote(); if (handler != NULL) { handler->setID(0, NULL); } mHandlers.removeItemsAt(index);}
void ALooperRoster::unregisterStaleHandlers() { Vector<sp<ALooper> > activeLoopers; { Mutex::Autolock autoLock(mLock); for (size_t i = mHandlers.size(); i > 0;) { i--; const HandlerInfo &info = mHandlers.valueAt(i); sp<ALooper> looper = info.mLooper.promote(); if (looper == NULL) { ALOGV("Unregistering stale handler %d", mHandlers.keyAt(i)); mHandlers.removeItemsAt(i); } else { // At this point ‘looper‘ might be the only sp<> keeping // the object alive. To prevent it from going out of scope // and having ~ALooper call this method again recursively // and then deadlocking because of the Autolock above, add // it to a Vector which will go out of scope after the lock // has been released. activeLoopers.add(looper); } } }}
异步消息机制的创建
sp<ALooper> mLooper = new ALooper; //创建一个Alooper实例sp<AHandlerReflector> mHandler = new AHandlerReflector //创建一个Ahandler实例mLooper->setName(“xxxxx”); //设置looper名字mLooper->start(false, true, PRIORITY_XXX); //根据参数创建并启动 looper threadmLooper->regiserHandler(mHandler); //register handler 会调用AHandler的setID方法将looper设置到Handler里去
Post消息
sp<AMessage> msg = new AMessage(kWhatSayGoodbye, mHandler); //在AMessage的构造方法里获取Ahandler对应的Looper并保存msg->post(); // 调用looper的post方法
Message Post的调用过程
Message::post
↓
ALooper::postmEventQueue.insertmQueueChangedCondition.signal() //如果之前没有event,通知looper thread
↓
ALooper::loop()if (mEventQueue.empty()) { //如果消息队列为空,则等待mQueueChangedCondition.wait(mLock);return true;}event = *mEventQueue.begin();event.mMessage->deliver();
↓
AHandler::deliverMessage
↓
AHandlerReflector:: onMessageReceived
↓
具体的实现
阅读全文
0 0
- AHandler and AMessages
- AHandler机制
- AHandler机制
- Nuplayer 中的Ahandler 分析
- android native ALooper AHandler
- libstagefright 框架设计分析 (1): ALooper, AHandler
- Android Media Player 框架分析-AHandler AMessage ALooper
- Android流媒体框架的AHandler消息机制分析
- android多媒体框架之流媒体AHandler消息机制----base on jellybean(十)
- Android多媒体框架之流媒体AHandler消息机制----base on jellybean(九)
- android多媒体框架之流媒体AHandler消息机制----base on jellybean(十)
- android多媒体框架之流媒体AHandler消息机制----base on jellybean(十)
- ]android多媒体框架之流媒体AHandler消息机制----base on jellybean(十)
- android多媒体框架之流媒体AHandler消息机制----base on jellybean(十) .
- ]android多媒体框架之流媒体AHandler消息机制----base on jellybean(十)
- android多媒体框架之流媒体AHandler消息机制----base on jellybean(十)
- android多媒体框架之流媒体AHandler消息机制----base on jellybean(十)
- ②NuPlayer播放框架之ALooper-AHandler-AMessage底层机制分析
- Sublime Text3 一些功能,插件,设置
- 关于刷微信投票的js代码
- 新手建站免费空间及其使用体验
- HDU 5673 Robot
- Mono Dev 默认consoles字体,中午字体注释乱码
- AHandler and AMessages
- JAVA基础准备要点---(JAVA初始化顺序)
- const与一级指针二级指针结合
- Android自定义控件8----直接绘制也可完成滑动
- caffe之Data_Layer层代码解析
- [Oracle 11g r2(11.2.0.4.0)]Oracle Golden Gate Training-workshop6
- 查看ORACLE 数据库及表信息
- nodejs之require方法
- chartJS+ajax+ssm简单整合