cocos2dx获取网络时间(二):浅析CCHttpClient(3)
来源:未知 责任编辑:责任编辑 发表时间:2015-03-01 01:33 点击:次
p> 3 request->setRequestType(CCHttpRequest::kHttpGet);
p> 4 request->setTag("WebTime");
p> 5 request->setResponseCallback(this, httpresponse_selector(HelloWorld::onHttpComplete));
p> 6 CCHttpClient::getInstance()->send(request);*/
p> 7
p> 8 NetTime * netTime = NetTime::create();
p> 9 netTime->requestNetTime();
p>10 char timeStr[50];
p>11 sprintf(timeStr, "NetTime %d-%d-%d %d:%d:%d",
p>12 netTime->getYear(), netTime->getMonth(), netTime->getDay(),
p>13 netTime->getHour(), netTime->getMinute(), netTime->getSecond());
p>14 CCLabelTTF *timeLabel = CCLabelTTF::create(timeStr, "Arial", 18);
p>15 timeLabel->setPosition(ccp(240, 50));
p>16 this->addChild(timeLabel);
p>
p> 进行调试:
p>
p>
p>
p> 异常信息为:变量timeStr内存损坏。可以分析得到引发此异常最可能的原因是netTime的getYear(),getMonth()...方法均没有返回正确的值。
p>
p> 再来看上面NetTime类的代码,发现对_year,_month,_day,_hour,_minute,_second的赋值操作均在onHttpComplete()方法,也就是CCHttpClient网络请求的回调方法中。
p>
p> 由此可以断定,在我们使用netTime的getYear(),getMonth()...方法返回字段值的时候 ,onHttpComplete()回调方法并没有执行。那么,为什么回调方法没有执行呢??
p>
p> 通过查看Cocos2dx的api文档,发现对CCHttpClient有这样一句描述:处理异步http请求的单例模式 一旦请求完成,一个在生成请求时被提供的回调函数,会被发到主线程中
p>
p> 到这里就恍然大悟了,原来CCHttpClient的http请求为异步方法,进行http请求并不会堵塞cocos2dx主线程的执行。
p>
p> 这种情况下一个比较好的解决思路是,我们在onHttpComplete方法中对字段进行赋值之后,同样触发一个回调方法,在外部类需要读取网络时间的地方注册该回调方法。
p>
p> (对C++回调函数不熟悉的可以参考这里:C/C++之回调函数)
p>
p> 为了符合cocos2dx的使用习惯,我们参考cocos2dx中常用的回调方法设计,如CCHttpRequest中的回调。
p>
p> 通过查看CCHttpRequest源码可以发现,首先声明了用于调用回调方法的函数指针和用于注册回调方法的宏:
p>
p> typedef void (CCObject::*SEL_HttpResponse)(CCHttpClient* client, CCHttpResponse* response);
p> #define httpresponse_selector(_SELECTOR) (cocos2d::extension::SEL_HttpResponse)(&_SELECTOR)
p>
p> setResponseCallback进行回调方法注册的实现如下,两个参数分别为回调方法的调用者和函数指针:
p>
p> inline void setResponseCallback(CCObject* pTarget, SEL_HttpResponse pSelector)
p> {
相关新闻>>
最新推荐更多>>>
- 发表评论
-
- 最新评论 更多>>