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>       {
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
用户名: 验证码:点击我更换图片
最新评论 更多>>

推荐热点

  • cocos2d-x学习笔记(19)--label 、label atlas
  • cocos2d-x学习笔记(23)--地图的使用3--CCTMXLayer
  • Cocos2d-x 2.0 之 Actions “三板斧” 之一
  • Cocos2d-x学习(一):HelloWorld
  • cocos2d-x学习笔记(18)--游戏打包(windows平台)
  • cocos2d 设置屏幕默认方向
  •  Cocos2d-x初学指南(5): Tiled Map的使用(视角移动,碰撞检测)
  • cocos2d-x学习笔记(16)--spritesheet(精灵表单)
  • cocos2d-x学习笔记(15)--地图的使用(TMX)
网站首页 - 友情链接 - 网站地图 - TAG标签 - RSS订阅 - 内容搜索 - 移动版 - 返回顶部
Copyright © 2008-2013 计算机技术学习交流网. 版权所有

豫ICP备11007008号-1