2011-08-01 5 views
0

私は、16市場の価格フィードを呼び出してアプリに表示するアプリを作成しています。Flash AS3が毎秒XMLコールをロックする

as1に問題はありませんが、ロックされることはありませんが、as3では20回の呼び出し(20秒間のデータ)が発生してロックされます。私はAS3で

または任意の他のアイデアについて知らないことのように私は考えていた

は、緩衝系か何かがあります。ここで

コードは、私はあなたが本当に秒後に送信されるHTTP要求のために意図していることを検証についてThe_asManさんのコメントを参照してくださいしたい

//=================================== 
// 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][email protected]; 
    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(); 

おかげ

+0

myTimerが毎秒たTimerListenerを呼び出しているが、どの毎秒callPriceFeedを呼び出します。私はあなたのロジックがそこに健全だとは思わない。 –

+0

これは私が必要とするものです。毎秒XMLが更新され、毎秒それを呼び出して新しい株価をリロードする必要があります。 – gringoLoco007

+0

あなたはこのサーバーに負担をかけていますか? –

答えて

0

です。

複数のHTTPリクエスト/レスポンスを同時に処理できるようにしているにもかかわらず、グローバル変数を使用してデータを格納/表示するため、データを連続的に要求するアプローチを試してみてください。このように、異なる帯域幅能力を持つクライアントは、最大で1秒に1回データを要求することができ、帯域幅がより小さいクライアントは、UIが最新の応答をレンダリングする前にデータを再要求することによって、

基本的には、タイマーを1秒間停止させてから、エラーが発生した場合、または応答が完全に処理された後にもう一度タイマーを起動します。

私の変更は、複数のファイルの非同期ロードするためのいくつかの素晴らしいソリューション(フレームワーク)が既に存在している// 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(); 
} 
+0

投稿しておきます – gringoLoco007