Hi~请问各位前辈
有关 httpclient 下载的资料如何在 main thread 读取的?小弟开发的游戏因为使用了 httpclient 到 web server 下载数据,
并且透过 schedule 方式来读取这些数据, 但游戏就是会莫名其妙的报错, 然后关闭游戏(直接 crash掉), 我的源码如下,希望前辈门可以协助,感恩!
- 我的程序码是这样的,按下购买卡片的按钮后,将参数传送给 buyCard.aspx, 并且设定 schedule, 每隔0.3秒就检查一下下载状态(status)
void WuXiaButtonSaleBuy::buyCard()
{
status = BuyCardButtonBuying;
this->schedule(schedule_selector(WuXiaButtonSaleBuy::CheckStatus),0.3f);
cocos2d::extension::CCHttpRequest* request = new cocos2d::extension::CCHttpRequest();
char* url= new char;
string buySaleParams = WuXiaPlayer::player->sessionId.c_str();
buySaleParams.append("," + saleId);
sprintf(url,"%sbuyCard.aspx?text=%s",WuXiaServer::SecondaryServer,base64_encode(buySaleParams.c_str()).c_str());
request->setUrl(url);
request->setRequestType(cocos2d::extension::CCHttpRequest::kHttpGet);
request->setResponseCallback(this, httpresponse_selector(WuXiaButtonSaleBuy::OnBuyCompleted));
cocos2d::extension::CCHttpClient::getInstance()->send(request);
request->release();
delete url;
}
- 接着下载完成后, 将资料保存到 sString 全域变数, 并且将下载状态改成 BuyCardButtonBought
void WuXiaButtonSaleBuy::OnBuyCompleted(cocos2d::extension::CCHttpClient* client, cocos2d::extension::CCHttpResponse* response)
{
CCSize visibleSize = CCDirector::sharedDirector()->getVisibleSize();
CCPoint origin = CCDirector::sharedDirector()->getVisibleOrigin();
std::vector<char> buffer = response->getResponseData();
char cString = new char;
for (unsigned int i=0;i<buffer->size();i++)
{
sprintf(cString+i,"%c",(*buffer));
}
std::string newStr(cString);
std::size_t found = newStr.find("ERROR");
if (found==std::string::npos && newStr.find("SUCCESS#" ) != std::string::npos && newStr.find("#SUCCESS" ) != std::string::npos)
{
buyResult = newStr;
status = BuyCardButtonBought;
}
else
{
status = BuyCardButtonFailed;
}
}
- schedule 每隔一断时间检查一次, 如果状态为BuyCardButtonBought 就开始将刚才所读取到的资料 split 后保存到 parts 中, 并且产生一个 sprite 显示到画面上
void WuXiaButtonSaleBuy::CheckStatus(float dtTime)
{
if (status == BuyCardButtonFailed)
{
// ask player whether to buy again or not.
return;
}
if (status == BuyCardButtonBought)
{
vector<string> parts = StringHelper::split(sString,"#");
CCSprite* sprite = CCSprite::Create(parts .at(1).c_str());
this->addChild(sprite);
status = BuyCardButtonNormal;
}
}
上面这些有时可以正常的运作, 有时载显示完 sprite 后, 在不固定的地方就会报错并关闭游戏
恳请前辈指点,感谢!*