好吧,这是一个奇怪的错误......
在我的应用程序中,我加载了多个 xml 文件。为了加载这些,我总是创建一个新的 URLLoader。没什么特别的。
第一个文件工作正常,第二个文件也可以。然而,第三个报告加载正常,但它保存的数据实际上是第二个文件的数据。当前的解决方法是两次加载第三个文件,这以某种方式起作用……很奇怪。
我完全不知道怎么会发生这样的事情。这三个文件当然是具有不同路径的不同文件。
这里是相关的类,希望对大家有用,如果有不清楚的地方请追问。DownloadJob 类只是一个辅助类,它包含一个 String 和一个 Function 对象。下载完成后调用后者。
// Actual class stuff
private var _downloadQueue :Array = new Array();
/**
* Adds a download to the queue. Will be started immediatly.
* @param p_url The URL of the download.
* @param p_callback The function to call when the download is finished. Has to take a DisplayObject/Sound/String as first parameter.
*/
public function addDownload(p_url:String, p_callback:Function) :void
{
var job :DownloadJob = new DownloadJob(p_url, p_callback);
_downloadQueue.push(job);
debug.ttrace("added: " + job.url);
// If it is the only item, start downloading
if (_downloadQueue.length == 1)
{
var job :DownloadJob = DownloadJob(_downloadQueue[0]);
load(job);
}
}
/**
* Will call the callback and dispatch an event if all loading is done.
* @param p_event The event that is passed when a download was completed.
*/
private function downloadComplete(p_event:Event) :void
{
var job :DownloadJob = DownloadJob(_downloadQueue[0]);
var downloaded :Object = p_event.target;
_downloadQueue.splice(0, 1);
debug.ttrace("completed: " + job.url);
// Notify via callback
if (downloaded is LoaderInfo)
{
job.callback(downloaded.content);
}
else if (downloaded is Sound)
{
job.callback(downloaded);
}
else if (downloaded is URLLoader)
{
// This one holds the data of the previously loaded xml, somehow
job.callback(URLLoader(downloaded).data);
}
// Continue downloading if anything is left in the queue
if (_downloadQueue.length > 0)
{
var job :DownloadJob = DownloadJob(_downloadQueue[0]);
load(job);
}
else
{
dispatchEvent(new Event(EVENT_DOWNLOADS_FINISHED));
}
}
/**
* Will load the passed job immediatly.
* @param p_job The job to load.
*/
private function load(p_job:DownloadJob) :void
{
// Different loaders needed for data, sound and non-sound
if (p_job.url.indexOf(".xml") != -1 ||
p_job.url.indexOf(".txt") != -1)
{
var urlloader :URLLoader = new URLLoader();
urlloader.addEventListener(Event.COMPLETE, downloadComplete);
urlloader.addEventListener(IOErrorEvent.IO_ERROR, handleError);
urlloader.load(new URLRequest(p_job.url));
}
else if ( p_job.url.indexOf(".mp3") != -1 &&
p_job.url.indexOf(".flv") != -1)
{
var sound :Sound = new Sound();
sound.addEventListener(Event.COMPLETE, downloadComplete);
sound.addEventListener(IOErrorEvent.IO_ERROR, handleError);
sound.load(new URLRequest(p_job.url));
}
else
{
var loader :Loader = new Loader();
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, downloadComplete);
loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, handleError);
loader.load(new URLRequest(p_job.url));
}
}
}