Хорошо, вот одна странная ошибка ...
В моем приложении я загружаю несколько файлов 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));
}
}
}