Хорошо, вот одна странная ошибка ...Вспышка AS3 - URLLoader загружает последние данные снова
В моем приложении, я загрузить несколько файлов 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));
}
}
}
Хорошо, я узнал, что он работает, если я НЕ использую новый URLLoader каждый раз. Когда я использую один и тот же URLLoader для всех моих запросов, ошибка исчезла. Это обходное решение, с которым я могу жить. ... ... Тем не менее, ошибка меня смущает. Должна быть какая-то ошибка памяти во Flash. – TheSHEEEP
Прежде всего, ваша строка, в которой вы проверяете, является ли файл FLV или MP3 неправильным. Ваше условное выражение && not ||. Во-вторых, я не уверен, что вы можете загрузить FLV в класс Sound, но я могу ошибаться.В-третьих, вы можете публиковать ВСЕ код, так как этот код ничего не показывает, кроме того, как вы загружаете, когда реальная проблема вполне может исходить из вашего поколения URL-адресов, которое вы передаете addDownload. –
Спасибо за звуковой подсказку, понял, что звук может загружать только mp3 некоторое время назад, но забыл удалить это из класса. Как показывает мой вышеприведенный комментарий, работа с URL-адресом работает правильно. – TheSHEEEP