Просмотр полной версии : Асинхронная загрузка внешних файлов во Flash CS4 cредствами AS3.0
VovaNetLS
18.05.2010, 20:56
Я не очень много времени работаю с AS3. И вот в чем проблема.
Мне нужно загрузить одновременно несколько файлов. После нескольких недель поиска решения я узнал что ето достигаетса с помощю компонентов Adobe AIR 1.5 в частности.
Но компоненти Adobe AIR очень плохо настраиваютса на роботу с HTML.
Конкретнее если файл запускать через отладку в Flash CS4 то все вроде нормально, но если делать публикацию, swf и html то ничево не отображаетса и ничево не работает.
Пример такой загрузки http://www.adobe.com/products/air/
Зарание спасибо
http://www.adobe.com/products/air/ - я слабо петрю в AIR, но по ссылке явно не AIR приложение %)
Тупо куча лоадеров/урллоадеров, по числу файлов, которые надо асинхронно загрузить, тупо вызвать у них у всех подряд .load (например в одной функции) и они будут грузить вполне асинхронно. Думаю по ссылке где-то так и сделано.
Zebestov
18.05.2010, 23:50
ххех. VovaNetLS, тут люди рулоны кода последовательной загрузки на любой вкус выкладывают, а ты хочешь как-то необычно сделать то, что и так само собой происходит =)
VovaNetLS
19.05.2010, 17:50
-De- такая реализация не подходит.
Я использовал URLLoader так как нужно грузить xml, mp3, png, css.
В начале реестриловал собитие Event.OPEN, потом Event.PROGRESS и наконец Event.COMPLETE. Собитие Event.OPEN второво файла начинаетса после собития Event.COMPLETE первово. И так в сторгой последовательности задания файлов.
Мне же нужно чтоб загружались все файлы одновременно и виводились на екран в последовательности увеличения размера файла...
Добавлено через 35 секунд
Zebestov а не моглы бы Ви навести какие то примеры?
Zebestov
19.05.2010, 19:05
Zebestov а не моглы бы Ви навести какие то примеры?
Да ну скукота =) лучше ты кинь код, который у тебя сам по себе последовательную загрузку организует, во заинтриговал 0о
VovaNetLS
19.05.2010, 19:19
В файле ShowLoading.as есть масив
в масиве передаютса: путь, имя файла, его тип и приоритет загрузки
все даные берутса с глобального класа GlobalData
LoadArrayData = new Array(new Array(GlobalData.PathXml, GlobalData.FileXML, "XML", 1),
new Array(GlobalData.PathTrack, GlobalData.FileSound, "Sound", 0),
new Array(GlobalData.PathPic, GlobalData.FilePic, "Bitmap", 1),
new Array(GlobalData.PathStyleCSS, GlobalData.FileCss, "StyleSheet", 1));
for each (var file:* in LoadArrayData) {
ObjLoaderContent.LoadData(file[0], file[1], file[2]);
}
после каждой итерации цикла визиваетса функция из класа LoaderContent.as
public function LoadData(path:String,file:String,priority:int):void
{
var urlRequest:URLRequest = new URLRequest(path + file);
var dataLoader:URLLoader = new URLLoader ;
dataLoader.addEventListener(Event.OPEN,OpenLoadData,false,priority);
dataLoader.addEventListener(ProgressEvent.PROGRESS,ProgressLoadData,false,priority);
dataLoader.addEventListener(Event.COMPLETE,ComplLoadData,false,priority);
dataLoader.load(urlRequest);
}
private function OpenLoadData(e:Event):void
{
CountFirstLoadItem += 1;
if (CountFirstLoadItem>=ShowLoading.LoadArrayData.length) {
ObjShowLoading.StopCircutRound();
}
}
private function ProgressLoadData(e:ProgressEvent):void
{
ShowLoading.LoadArrayData[CountFirstLoadItem-1][4]=e.bytesLoaded/e.bytesTotal;
}
private function ComplLoadData(e:Event):void
{
}
и количество загруженых байтов должно передаватса в ShowLoading.as где меняет свой статус полоса загрузки
Zebestov
19.05.2010, 19:28
пока читаю, отмечу, что сейчас придет etc, и "заколет вилами за неоформленный код" ;)
VovaNetLS, отредактируйте свой пост и оформите код тегами .
Zebestov
19.05.2010, 19:45
в zip-е в указанном тобой классе и соотв. методе совсем другой код — там работа ведется с FileStream. ты код, который тут выложил тестировал? именно он у тебя грузит последовательно?
P.S. оформи код тегами — глаза рэжэт
VovaNetLS
19.05.2010, 19:54
да именно он... при чем если передавать в собитии
private function ProgressLoadData(e:ProgressEvent):void
{
ShowLoading.LoadArrayData[CountFirstLoadItem-1][4]=e.bytesLoaded/e.bytesTotal;
}
количество байтов передаетса тогда, когда файл полностю загружен то есть 1
архив я заменил
Zebestov
19.05.2010, 20:27
хм. а фишка в том, что я увлекся и не уследил, что всю дорогу говорил о Loader, а ты тут работаешь с URLLoader. отдуплился когда прочитал, что его bytesTotal равен нулю вплоть до окончания загрузки (какой полезный оказывается параметр). в отличие от LoaderInfo — там да, там сразу после первого PROGRESS уже известно общее кол-во байт.
Тогда лишь уточню: это Loader грузит сразу как ему сказали load() без оглядки на прочие загрузки. Ограничения накладывает лишь браузер (ну например (http://support.microsoft.com/kb/282402/ru)).
неужели URLLoader работает иначе? :eek:
VovaNetLS
19.05.2010, 20:31
по моему иначе. Но что самое забавное так ето то что Loader грузит только рисунки и SWF файлы(((
Даже в мануалах по AS3 так и написано цитирую: "Класс Loader используется для загрузки SWF-файлов либо файлов изображений (JPG, PNG или GIF). Используйте метод load() для инициации загрузки. Загруженный экранный объект добавляется в качестве потомка объекта Loader.
Используйте класс URLLoader для загрузки текстовых или двоичных данных."
Zebestov
19.05.2010, 20:35
та да... но я просто с ним не спотыкался еще и руку на отсечение не дам, что он тоже должен работать без оглядки на прочие загрузки и идти параллельно с ними настолько, насколько ему позволяет браузер.
VovaNetLS
20.05.2010, 18:06
протестировал я Loader и...
Грузит он асинхронно что и нужно было, но он грузит только SWF или файлы изображений (JPG, PNG или GIF). На mp3 и css выдает что неизвестный тип загруженного файла(((
Zebestov
20.05.2010, 18:08
ну это да. он не для этого. в твоем случае таки URLLoader.
VovaNetLS
20.05.2010, 18:13
а как мне уже известно после неоднократных иследований URLLoader грузит файлы синхронно (то есть по очереди) (((
кстати, у меня во флексе 100% URLLoader асинхронно грузит(проверял, да, на локалхост закидывал). В вашем проекте действительно не хотел асинхронно, в чем причина не стал особо разбираться, то-ли IDE, то-ли dataFormat="binary", а мож ещё что.
VovaNetLS
21.05.2010, 01:30
Все получилось :yahoo::yahoo::yahoo:
Решение просто настолько что способно запутать даже опытного програмиста на AS3. Дело в том что URLLoader грузит файлы синхронно если в URLRequest прописать путь и имя файла, например
var urlRequest:URLRequest = new URLRequest("folder/file.txt");
var urlLoader:URLLoader = new URLLoader;
//собития
urlLoader.load(urlRequest);
И вот тепер самая "изюминка". :) Если написать
var urlRequest:URLRequest = new URLRequest("http://www.mysite.com/folder/file.txt");
var urlLoader:URLLoader = new URLLoader;
//собития
urlLoader.load(urlRequest);
загрузка будет происходить полностью ассинхронно!!!
Zebestov, -De- спасибо за помощь :victory:
Zebestov
21.05.2010, 02:55
ххех ) буду знать
Дело в том что URLLoader грузит файлы синхронно
VovaNetLS, Вы не ошиблись? Исполнение кода приостанавливается на время загрузки?
VovaNetLS
01.06.2010, 16:25
dimarik - если тестировать пошагово, то загрузка идет последовательно, если использовать trace исполнение кода не приостанавливаетса.
dimarik - если тестировать пошагово, то загрузка идет последовательно, если использовать trace исполнение кода не приостанавливаетса.
Так синхронно или нет? :quiet:
Я бы сказал, почти асинхронно: загрузка забирает себе все время выполнения...
Вот код, которым я пробовал разорвать последовательность загрузки...
test.png - файл в 5 мегабайт
package
{
import flash.display.Sprite;
import flash.events.Event;
import flash.events.ProgressEvent;
import flash.net.URLLoader;
import flash.net.URLRequest;
import flash.utils.*;
public class Main extends Sprite
{
public function Main():void
{
super();
addEventListener(Event.ADDED_TO_STAGE, init);
}
private var interval:int;
private function init(e:Event):void
{
removeEventListener(Event.ADDED_TO_STAGE, init);
var urlRequest:URLRequest = new URLRequest("lib/test.png");
var urlLoader:URLLoader = new URLLoader;
urlLoader.load(urlRequest);
urlLoader.addEventListener(Event.COMPLETE, completeListener);
urlLoader.addEventListener(ProgressEvent.PROGRESS, progressListener);
addEventListener(Event.ENTER_FRAME, enterFrameListener);
trace("after: " + getTimer());
interval = setInterval(intervalFunction, 0.0000001);
}
private var removeInterval:int = 6;
private function intervalFunction():void {
if (removeInterval-- == 0) {
clearInterval(interval);
}
trace("Interval: " + getTimer());
}
private var removeEnterFrame:int = 6;
private function enterFrameListener(e:Event):void {
trace("enter frame: " + getTimer());
if (removeEnterFrame-- == 0) {
removeEventListener(Event.ENTER_FRAME, enterFrameListener);
}
}
private function progressListener(e:ProgressEvent):void {
trace("progress: " + getTimer());
}
private function completeListener(e:Event):void {
trace("complete: " + getTimer() );
}
}
}
Почти — не считается. Загрузка асинхронна целиком и полностью.
VovaNetLS
02.06.2010, 20:14
Почти — не считается. Загрузка асинхронна целиком и полностью.
Загрузка полностю ассинхронная если грузить с интернета... Виполнение кода не приостанавливаетса...
Загрузка полностю ассинхронная если грузить с интернета... Виполнение кода не приостанавливаетса...
Она всегда асинхронная. Без вариантов.
VovaNetLS
03.06.2010, 13:01
Она всегда асинхронная. Без вариантов.
если грузить с локальной папки то загрузка асинхронная и как показивают трейсы совсем иначе передаютса bytesLoaded
Ииии что? Загрузка перестает быть асинхронной? Нет.
То, что иначе грузится, тоже совершенно неудивительно.
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.