MyHandler向外部提供了一个接口connect来完成RTSP流的连接。
下面贴出安卓N版本MyHandler::connect原文:
void connect() {
//下面是注册两个handler,mConn(sp<ARTSPConnection>)和mRTPConn(sp<ARTPConnection>)
//注册后mConn这个handler与looper()得到的looper绑定在一起
//mRTPConn这个handler与mNetLooper这个looper绑定在一起
looper()->registerHandler(mConn);
(1 ? mNetLooper : looper())->registerHandler(mRTPConn);
//新建立一个通知消息notify作为参数传递给observeBinaryData函数
//注意:notify消息创建传递的handler是this,也就是MyHandler,那么对消息名为'biny'的消息notify的处理在MyHandler::onMessageReceived的case 'biny'处理分支里
//mConn->observeBinaryData(notify)函数的功能在下文介绍
sp<AMessage> notify = new AMessage('biny', this);
mConn->observeBinaryData(notify);
//新建一个应答消息,消息名为'conn',消息的处理者为this,也即MyHandler
//相应的对消息名为'conn'的消息reply处理就会在MyHandler::onMessageReceived的case 'conn'分支里
//mOriginalSessionURL.c_str()为会话的url,也就是需要连接的RTSP源的地址
//将参数mOriginalSessionURL.c_str()和reply传递给mConn(sp<ARTSPConnection>)的connect函数来完成RTSP流的连接
//mConn(sp<ARTSPConnection>)的connect函数后续的文章向大家介绍
sp<AMessage> reply = new AMessage('conn', this);
mConn->connect(mOriginalSessionURL.c_str(), reply);
}
下面贴出安卓N版本mConn->observeBinaryData(notify)的调用流程:
==>
mConn->observeBinaryData(notify)
==>
void ARTSPConnection::observeBinaryData(const sp<AMessage> &reply) {
//新建消息msg,消息名为kWhatObserveBinaryData,消息的处理者为this。也即ARTSPConnection
//则对消息名为kWhatObserveBinaryData的消息msg的处理就是在ARTSPConnection::onMessageReceived的case kWhatObserveBinaryData处理分支
//将传递来的参数即消息reply的引用设置到"reply"字段中
sp<AMessage> msg = new AMessage(kWhatObserveBinaryData, this);
msg->setMessage("reply", reply);
msg->post();
}
==>
void ARTSPConnection::onMessageReceived(const sp<AMessage> &msg) {
switch (msg->what()) {
case kWhatConnect:
onConnect(msg);
break;
case kWhatDisconnect:
onDisconnect(msg);
break;
case kWhatCompleteConnection:
onCompleteConnection(msg);
break;
case kWhatSendRequest:
onSendRequest(msg);
break;
case kWhatReceiveResponse:
onReceiveResponse();
break;
case kWhatObserveBinaryData:
{
//对消息名为kWhatObserveBinaryData的处理
//从该消息的"reply"字段得到reply消息的引用
CHECK(msg->findMessage("reply", &mObserveBinaryMessage));
break;
}
default:
TRESPASS();
break;
}
}
小结:MyHandler函数提供的connect函数接口对RTSP流的连接是通过MyHandler应有的ARTSPConnection对象的引用mConn提供的connect函数来完成对RTSP流的连接的。
在连接前设置了ARTSPConnection对象mConn的成员对象mObserveBinaryMessage,即完成这个消息引用的设置,消息名为’biny’,消息处理者为MyHandler,对这个消息的处理将会在MyHandler::onMessageReceived的case ‘biny’处理分支里。