Загружаем внешние ресурсы

Представим, что нашему приложению нужно загрузить некоторые внешние ресурсы. Этими ресурсами могут быть png-файлы (которые в приложении мы будем использовать в виде Bitmap), и xml-файлы. Ну это потому, что мне нужны именно такие ресурсы. Причем файлов может быть несколько, а приложению нужно дождаться, пока загрузятся все, и потом продолжить выполнение.

Для сих целей я сделал класс ResourceLoader. Ему передаются линки на ресурсы, которые нужно загрузить, потом вызвается метод Load. По линкам класс определяет, какой вид ресурса и как нужно загрузить, загруженные данные сохраняет в Hash, откуда их можно будет получить по id-ресурса. Для png-файлов таким id будет сам url картинки, а для xml-файлов id должен быть указан в аттрибуте корневого узла. Ну и когда все файлы будут загружены, ResourceLoader оповестит приложение, что можно рабоать дальше.

/**
 * @author Yzh
 */

package com.yzh44yzh.core;

import flash.display.Loader;
import flash.display.Bitmap;
import flash.events.Event;
import flash.net.URLLoader;
import flash.net.URLRequest;

class ResourceLoader
{
        // constants
        static inline var REG_BITMAP:   EReg = ~/.png$/i; //TODO - jpg, jpeg
        static inline var REG_XML:      EReg = ~/.xml$/i;
       
        // properties
        public var ReadyHandler:        Void->Void;

        private var busy:               Bool;
        private var numLoaded:          Int;
        private var toLoad:             List<String>;
        private var bitmaps:            Hash<Bitmap>;
        private var xmls:               Hash<Xml>;

        // constructor
        public function new()
        {
                this.busy = false;
                this.toLoad = new List();
                this.bitmaps = new Hash();
                this.xmls = new Hash();
        }

        // getters & setters

        // methods
        public function Add(url:String):Void
        {
                if(this.busy) throw 'ResouceLoader is busy';

                //TODO - check is this url not added yet
                this.toLoad.add(url);
        }

        public function Load():Void
        {
                this.busy = true;
                this.numLoaded = 0;

                for(url in this.toLoad)
                {
                        if(REG_BITMAP.match(url))
                        {
                                var bl = new Loader();
                                bl.contentLoaderInfo.addEventListener(Event.COMPLETE, OnBitmap);
                                bl.load(new URLRequest(url));
                        }
                        else if(REG_XML.match(url))
                        {
                                var xl = new URLLoader();
                                xl.dataFormat = 'text';
                                xl.addEventListener(Event.COMPLETE, OnXml);
                                xl.load(new URLRequest(url));
                        }
                }
        }
       
        public function GetBitmap(id:String):Bitmap
        {
                return this.bitmaps.get(id);
        }

        public function GetXml(id:String):Xml
        {
                return this.xmls.get(id);
        }

        private function OnBitmap(event:Event):Void
        {
                var id:String = event.target.url;
                var bitmap:Bitmap = event.target.loader.content;
                this.bitmaps.set(id, bitmap);

                this.numLoaded++;
                if(this.numLoaded == this.toLoad.length) this.Ready();
        }

        private function OnXml(event:Event):Void
        {
                var xml:Xml = Xml.parse(event.target.data);
                var id:String = xml.firstElement().get('id');
                this.xmls.set(id, xml);

                this.numLoaded++;
                if(this.numLoaded == this.toLoad.length) this.Ready();
        }

        private function Ready():Void
        {
                this.busy = false;
                this.toLoad.clear();
                this.ReadyHandler();
        }

        public function toString():String { return 'ResourceLoader'; }         
}

Пример использования класса:

this.loader = new ResourceLoader();
this.loader.ReadyHandler = this.Start;
this.loader.Add('skin.png');
this.loader.Add('skin.xml');
this.loader.Load();

Комментарии

ResourceLoader

Вообще непонятно как работает скрипт!

Настройки просмотра комментариев

Выберите нужный метод показа комментариев и нажмите "Сохранить установки".

Отправить комментарий

Содержание этого поля является приватным и не предназначено к показу.
  • Allowed HTML tags: <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <blockcode> <dd>
  • Строки и параграфы переносятся автоматически.
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • You can enable syntax highlighting of source code with the following tags: <code>, <blockcode>.

Подробнее о форматировании

CAPTCHA
Этот вопрос помогает предотвратить автоматический спам
Image CAPTCHA
Enter the characters shown in the image without spaces, also respect upper and lower case.
To prevent automated spam submissions leave this field empty.