PDA

Просмотр полной версии : Загрузка данных из внешних файлов.


Torero
07.10.2007, 03:15
Доброго времени суток.
Есть несколько классов, загружающих информацию(xml, текст, картинки, swf) из внешних файлов. Решил процесс загрузки описать отдельным классом - не получается. Подскажите пжл.как это правильно реализовать:
а)Верна-ли вообще сама идея реализовать загрузчик через отдельный класс?
б)Конструктор не может быть сеттером - как передать данные объекту, вызвавшему класс? через "this"?
в)Как реализовать ожидание окончания загрузки?

Вот мой вариант: (нерабочий)

package {
import flash.display.Sprite;
public class SomeClass extends Sprite {
public function SomeClass(){
var myXML:XML = new XML();
myXML=XML(new FileLoad("test.xml"));
trace("Загрузили:"+myXML); //Загрузили: [object FileLoad], а не "Загрузили: <xx>.....</xx>"
}
}



package {
import flash.display.Loader;
import flash.net.URLRequest;
public class FileLoad extends Loader {
public function FileLoad(filepath:String){
var urlReq:URLRequest = new URLRequest(filepath);
this.load(urlReq);
}
}

Nirth
07.10.2007, 03:19
1) Да
1.1) Класс flash.display.Loader создан для загрузки визуальной информации(swf, jpg, png). тебе нужно юзать flash.net.URLLoader
2) Дело вкуса, я считаю это лишними 500 миллисекундами затрачеными на ненужный апендикс.
3) через события.

Torero
07.10.2007, 03:42
2 Nirth:Спасибо за быстрый ответ.
А)

1.1) Класс flash.display.Loader создан для загрузки визуальной информации(swf, jpg, png). тебе нужно юзать flash.net.URLLoader

То есть мне прийдется создать 2 класса: TextLoad и GraphLoad? или можно безболезненно это одним классом реализовать?


2) Дело вкуса, я считаю это лишними 500 миллисекундами затрачеными на ненужный апендикс.

не в производительности дело.. объем кода минимизирую и писАть правильно учусь..
Б)

3) через события.

Это понятно.. Вопрос в том как? События надо внутри класса-загрузчика прописывать или в том классе из которого этот загрузчик вызывается?

Исправил код загрузчика - все-равно не выдает нужный результат.

package {
import flash.display.Loader;
import flash.net.URLRequest;
public class TextLoad extends URLLoader {
public function TextLoad(filepath:String){
var urlReq:URLRequest = new URLRequest(filepath);
this.load(urlReq);
}
}
}

...
myXML=XML(new TextLoad("test.xml"));
trace("Загрузили: "+myXML); //Загрузили: [object TextLoad]
...

etc
07.10.2007, 10:44
а) Зачем?
б) Конструктор — это функция, которая может иметь параметры;
в) Событиями.

В целом, писать отдельный класс для этого не вижу нужды.

Nirth
07.10.2007, 13:50
не в производительности дело.. объем кода минимизирую и писАть правильно учусь..
Я считаю не правильным тратить 500 миллисекунд на ненужный аппендикс.
Тоесть я считаю не правильным писать this
у __etc другое мнение.


Исправил код загрузчика - все-равно не выдает нужный результат.


Ну и что должен быть за результат?


То есть мне прийдется создать 2 класса: TextLoad и GraphLoad? или можно безболезненно это одним классом реализовать?

Зависит от объема кода, если ты собираешься парсить текст, валидировать, проверять че нить там, или выдерать отдельные куски. То писать стоит.

Если просто грузить файлы то URLLoader уже существует, он отлично грузит файлы.

Torero
07.10.2007, 14:21
В целом, писать отдельный класс для этого не вижу нужды.

А разве многократный импорт не есть зло?


Ну и что должен быть за результат?

В данном случае - XML из файла, а не [object TextLoad].

etc
07.10.2007, 14:31
Многократный импорт? :)))
Директива import лишь указывает компилятору на то, какие области видимости классов нужно создать и все. Перед выполнением кода создается так называемый scope-стек, в котором хранятся все области видимости классов.
И, если уж рассуждать логически, то от отдельного класса станет меньше импортов? Нет, не станет, будет столько же + одна штука.
Выполнять непосредственную загрузку данных-то кто будет? Да все те же встроенные классы.
Идея одного интерфейса хороша, но её уже выполняет URLLoader, который может грузить данные в различных форматах, как в текстовых, так и бинарных. Что делать с полученными данными — решать программисту.

Nirth
07.10.2007, 15:04
В данном случае - XML из файла, а не [object TextLoad].
для этого надо переопределить метод toString()...

screamge
07.10.2007, 15:15
У меня лоудер вынесен в отдельный класс исключетельно из соображения использования одного прелоудера во всём проекте и грузит он при вызове статичного метода loadmc в который передаётся адрес мувика в который нужно грузить или имя клипа который нужно создать, меторасположение лоудера (_х, _у) или булево значение отвечающее за вывод клипа лоудера по центру созданного/указанного мувика. В принципе удобно.

etc
07.10.2007, 15:24
У меня лоудер вынесен в отдельный класс исключетельно из соображения использования одного прелоудера во всём проекте и грузит он при вызове статичного метода loadmc в который передаётся адрес мувика в который нужно грузить или имя клипа который нужно создать, меторасположение лоудера (_х, _у) или булево значение отвечающее за вывод клипа лоудера по центру созданного/указанного мувика. В принципе удобно.
Дядь, мы в разделе AS3 =)

screamge
07.10.2007, 15:30
Разделом ошибиться ладно но код из первого поста посчитать за АС2…:eek:
Извините.:rolleyes:

etc
07.10.2007, 15:35
Разделом ошибиться ладно но код из первого поста посчитать за АС2…:eek:
Извините.:rolleyes:
Я про твой пост, _x, _y всякие.

screamge
07.10.2007, 15:39
package src{
import flash.display.Sprite;
import flash.events.*;
import flash.net.*;

public class XmlFine extends EventDispatcher{
private static var instance:XmlFine;
private static var allowInstantiation:Boolean;

private var xml:XML;
private var loader:URLLoader;

public static function getInstance():XmlFine {
if (instance == null) {
allowInstantiation = true;
instance = new XmlFine();
allowInstantiation = false;
}
return instance;
}

public function XmlFine ():void {
if (!allowInstantiation) {
throw new Error("Error: Instantiation failed: Use XmlFine.getInstance() instead of new.");
}
}

public function load (lang:String):void {
loader = new URLLoader ();
loader.addEventListener (Event.COMPLETE, afterLoad);
loader.load (new URLRequest (lang + '_content.xml'));
}

public function get content ():XML {
return xml;
}

private function afterLoad (e:Event):void {
setXML ();
dispatcher ();
}

private function setXML ():void {
xml = new XML (loader.data);
}

private function dispatcher ():void {
dispatchEvent(new Event('onLoad'));
}

}
}


Ну вроде тогда так.


Я про твой пост, _x, _y всякие.


Я превьюс пост не дописал просто, редактировал.

Torero
07.10.2007, 16:58
....URLLoader, который может грузить данные в различных форматах, как в текстовых, так и бинарных. Что делать с полученными данными — решать программисту.

Поясни пожалуйста: Как, используя класс URLLoader, загрузить изображение?

Реализовал сабж следующим образом:

package {
import flash.display.Sprite;
import flash.text.TextField;
import flash.events.Event
public class SomeClass extends Sprite {
public function SomeClass(){
loadXML();
}
private function loadXML(){
var myXML:XML = new XML();
tL=new FileLoad("test.xml")
tL.addEventListener(Event.COMPLETE, xmlLoaded);
function xmlLoaded(e:Event){
myXML=XML(tL.data);
loadText()
}
}
private function loadText():void{
var tF:TextField=new TextField();
tL=new FileLoad("ru.txt")
tL.addEventListener(Event.COMPLETE, textLoaded);
addChild(tF);
function textLoaded(e:Event){
tF.htmlText=tL.data;
loadGraph();
}
}
private function loadGraph():void{
var pic:Sprite=new Sprite();
tL=new FileLoad("1.jpg")
tL.addEventListener(Event.COMPLETE, graphLoaded);
addChild(pic);
function graphLoaded(e:Event){
pic=tL.data;
}
}
}
}



package {
import flash.net.URLRequest;
import flash.net.URLLoader;
public class FileLoad extends URLLoader {
public function FileLoad(filepath:String){
var urlReq:URLRequest = new URLRequest(filepath);
this.load(urlReq);
}
}
}


1.XML и *.txt грузятся корректно. При попытке загрузить изображение, получаю: "Type Coercion failed: cannot convert "яШяа to flash.display.Sprite"
2.Нужно-ли использовать "removeEventListener", если листнер добавляется внутри private-функции?
3.для этого надо переопределить метод toString()...
А как мне это должно было помочь?

etc
07.10.2007, 17:01
Загрузить в бинарном режиме, потом отдать на растерзание Loader-у.

з.Ы. Никогда не пиши функции в методах, просто никогда.

DarkLight
07.10.2007, 17:02
Полученные бинарные данные изображения надо использовать через loadBytes

Torero
07.10.2007, 17:05
Никогда не пиши функции в методах, просто никогда.
В сотый раз уже слышу.. Ответьте, наконец, кто-нибудь: что в этом такого ужасного?
----
В данном случае, например, не приходится заморачиваться с областью видимости.

DarkLight
07.10.2007, 17:07
Куча лишних проблем с областями видимости, например. Опасность дублирования кода в процессе работы над проектом, затруднение рефакторинга и усложнение кода, затруднение документирования и сопровождения.

etc
07.10.2007, 17:11
В данном случае, например, не приходится заморачиваться с областью видимости.
В данном случае ты вообще лишаешься области видимости.

BlooDHounD
08.10.2007, 14:54
+ функции могут удалить из памяти мусорщиком.