PDA

Просмотр полной версии : Асинхронная загрузка внешних файлов во 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/
Зарание спасибо

-De-
18.05.2010, 23:24
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, и "заколет вилами за неоформленный код" ;)

etc
19.05.2010, 19:31
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 грузит файлы синхронно (то есть по очереди) (((

-De-
20.05.2010, 18:13
кстати, у меня во флексе 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
ххех ) буду знать

dimarik
21.05.2010, 13:48
Дело в том что URLLoader грузит файлы синхронно

VovaNetLS, Вы не ошиблись? Исполнение кода приостанавливается на время загрузки?

VovaNetLS
01.06.2010, 16:25
dimarik - если тестировать пошагово, то загрузка идет последовательно, если использовать trace исполнение кода не приостанавливаетса.

etc
02.06.2010, 07:50
dimarik - если тестировать пошагово, то загрузка идет последовательно, если использовать trace исполнение кода не приостанавливаетса.

Так синхронно или нет? :quiet:

zuxul
02.06.2010, 10:22
Я бы сказал, почти асинхронно: загрузка забирает себе все время выполнения...
Вот код, которым я пробовал разорвать последовательность загрузки...
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() );
}
}
}

etc
02.06.2010, 10:47
Почти — не считается. Загрузка асинхронна целиком и полностью.

VovaNetLS
02.06.2010, 20:14
Почти — не считается. Загрузка асинхронна целиком и полностью.
Загрузка полностю ассинхронная если грузить с интернета... Виполнение кода не приостанавливаетса...

etc
02.06.2010, 20:19
Загрузка полностю ассинхронная если грузить с интернета... Виполнение кода не приостанавливаетса...
Она всегда асинхронная. Без вариантов.

VovaNetLS
03.06.2010, 13:01
Она всегда асинхронная. Без вариантов.

если грузить с локальной папки то загрузка асинхронная и как показивают трейсы совсем иначе передаютса bytesLoaded

etc
03.06.2010, 13:34
Ииии что? Загрузка перестает быть асинхронной? Нет.
То, что иначе грузится, тоже совершенно неудивительно.