Flash AS3 блокируется в секунду XML-вызовом - PullRequest
0 голосов
/ 01 августа 2011

Я пишу приложение, которое вызывает ценовую ленту 16 рынков и отображает их в приложении.

В as1 нет проблем, оно никогда не блокируется ... но в as3 это может быть 20вызовы (20 секунд данных), а затем блокируется.

Я думал, есть ли система буферизации или что-то подобное, о чем я не знаю в as3

или любых других идеях.

Вот код

//===================================
// Package
//===================================
var priceFeedURL = "http://www.blabla.com/prices.xml";
var xmlLoader:URLLoader = new URLLoader();
xmlLoader.addEventListener(Event.COMPLETE, showXML);
var myObj:Object = new Object();
//===================================
// Call XML
//===================================
function Init():void {
    myTimer.start();
}
function callPriceFeed():void { 
    xmlLoader.load(new URLRequest(priceFeedURL));
}
function showXML(e:Event):void {
    XML.ignoreWhitespace = true;
    var pricesXML:XML = new XML(e.target.data);
    myObj.currentPrice = pricesXML.IT[3].@BP;
    PerSecondFunctions();
}
//===================================
// Timer
//===================================
var myTimer:Timer = new Timer(1000);
myTimer.addEventListener(TimerEvent.TIMER, timerListener);
function timerListener(e:TimerEvent):void {
    callPriceFeed();
}
//===================================
// Per Second functions
//===================================
function PerSecondFunctions():void {
    ShowPrice();
}
function ShowPrice():void {
    currentPriceTXT.text = "PRICE : "+myObj.currentPrice;
    trace(gnutradeObj.currentPrice+" "+Math.random());
    priceGlowMC.gotoAndPlay(2);
}

Init();

Спасибо

Ответы [ 2 ]

0 голосов
/ 01 августа 2011

Уже есть несколько хороших решений (каркасов) для асинхронной загрузки нескольких файлов:

http://code.google.com/p/bulk-loader/
http://www.greensock.com/loadermax/

0 голосов
/ 01 августа 2011

Я бы сослался на комментарий The_asMan о проверке того, действительно ли вы собираетесь отправлять HTTP-запросы раз в секунду.

Что я хотел бы сделать, так это попробовать подход, который последовательно запрашивает данные, главным образом потому, что вы используете глобальные переменные для хранения / представления данных, даже если вы также допускаете одновременную обработку нескольких запросов / ответов HTTP. Таким образом, клиенты с разной пропускной способностью могут запрашивать данные не чаще одного раза в секунду, а клиенты с более низкой пропускной способностью не будут ограничивать свои возможности, повторно запрашивая данные до того, как пользовательский интерфейс сможет отобразить последний ответ.

Обычно я останавливаю таймер на одну секунду, затем при ошибке или после того, как ответ был полностью / в основном обработан, снова запускаю таймер.

Мои изменения помечены // ADDED

xmlLoader.addEventListener(Event.COMPLETE, showXML);
xmlLoader.addEventListener(SecurityErrorEvent.SECURITY_ERROR, errorHandler);
xmlLoader.addEventListener(IOErrorEvent.IO_ERROR, errorHandler);

// ADDED - restart (or maybe don't restart?) on error
function errorHandler(e:Event):void{
   // log and/or show error?
   if(!myTimer.running)
       myTimer.start(); //start up again and hope for the best
}

function timerListener(e:TimerEvent):void {
    // ADDED - stop timer and resume it after showXML (or error handler) has handled the response
    myTimer.stop();
    callPriceFeed();
}


function ShowPrice():void {
    currentPriceTXT.text = "PRICE : "+myObj.currentPrice;
    trace(gnutradeObj.currentPrice+" "+Math.random());
    priceGlowMC.gotoAndPlay(2);
    // ADDED - data from response ought to have migrated to the UI, now start up timer again
    if(!myTimer.running)
        myTimer.start();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...