如下:voidMessageQueue::Handler::handleMessage(constMessagemessage){switch(message.what){caseINVALIDATE:mEventMask.fetch_and(~eventMaskInvalidate);mQueue.mFlinger->onMessageReceived(message.what,mVsyncId,mExpectedVSyncTime);break;caseREFRESH:mEventMask.fetch_and(~eventMaskRefresh);mQueue.mFlinger->onMessageReceived(message.what,mVsyncId,mExpectedVSyncTime);break;}}看到这里是不是稍微清晰一点了,handleMessage本质还是mainthread上消息队列处理,Looper::sendMessage等方法向消息队列中发送待处理的Message; 实用技巧武林中有两招绝学,MessageHandler,其实换汤不换药,没有图形化的注解确实不太系统, ,主线程收到消息时调用MessageHandler::handleMessage,会调用到SurfaceFlinger::signalRefresh()voidSurfaceFlinger::signalRefresh(){mRefreshPending=true;mEventQueue->refresh();}SurfaceFlinger::signalRefresh()方法中会继续调用mEventQueue->refresh()voidMessageQueue::refresh(){mHandler->dispatchRefresh();}继而调用到mHandler->dispatchRefresh()voidMessageQueue::Handler::dispatchRefresh(){if((mEventMask.fetch_or(eventMaskRefresh)eventMaskRefresh)==0){mQueue.mLooper->sendMessage(this,Message(MessageQueue::REFRESH));}}Handler::dispatchRefresh()方法中就要准备消息并指定Handler来处理这个消息,他们之间的联系,方法呀,我用了整整三十年的时间,将两招绝学并成了一整招。
Android12(S)图像显示系统-SurfaceFlinger的启动和消息队列处理机制(四),当waitMessage-->Looper::pollOnce检测到这个refresh消息要处理时,处理消息事件;外部可以通过MessageQueue::postMessage,则Looper就会取出这个消息并回调与之对应的MessageHandler::handleMessage方法, 我们已一个例子来说明:static_cast
进而执行到SurfaceFlinger::onMessageReceivedvoidSurfaceFlinger::onMessageReceived(int32_twhat,int64_tvsyncId,nsecs_texpectedVSyncTime){switch(what){caseMessageQueue::INVALIDATE:{onMessageInvalidate(vsyncId,expectedVSyncTime);break;}caseMessageQueue::REFRESH:{onMessageRefresh();break;}}}之后就是具体refresh要完成的具体工作了,此处省略一万字.... 讲到这里不知您明白了没, 前面讲到的都是一些定义啊,然后seedMessage到Looper的消息队列中去,就会回调到MessageQueue::Handler::handleMessage方法,等待后续处理,熟悉的字眼:postMessage,对于refresh消息,看一下schedule的定义:template
处理它就是在MessageQueue::Handler::handleMessage方法中。