112. Библиотека FPLoader.swc – Загрузка ресурсов

В уроке Загрузка ресурсов я рассказывал о том, как в теории организовать загрузку ресурсов во Flash-приложение. В этом уроке я покажу вам библиотеку FPLoader, которая поможет вам упростить процесс загрузки контента(тексты, картинки, флешки…). Что умеет делать эта библиотека? Вот список основных возможностей:

  • Загрузка любого типа контента: текст(.txt, .xml, …), изображения(.png, .jpg, .gif, …), флешки(.swf, создание экземпляра класса из загруженной флешки), бинарные файлы(ByteArray)
  • Организация очереди загрузки контента, с любым количеством одновременно работающих потоков
  • Получение статистики загрузки: скорость, время
  • Определение процента загрузки конкретного файла и списка файлов в целом. Загрузка и парсинг списка ресурсов, для определения точного размера загружаемых файлов и задания антикеша файлов

В этой статье мы разберем следующие вопросы:

Базовый синтаксис загрузчика

Основным в библиотеке является одноименный класс FPLoader, который осуществляет очередность загрузки ресурсов:

Конструктор класса FPLoader принимает первым параметром глобальный путь до ресурсов, далее все операции (загрузка, получение контента) происходит с использованием относительного пути, т.е. вы можете задать глобальный путь до каталога где лежат ресурсы, а затем в методе add указать путь с подкаталогами, например “images/image1.png”. Глобальный путь – параметр не обязательный.

Метод add принимает три параметра:

  1. source – Ссылка на объект, может быть как String, так и URLRequest
  2. id – Идентификатор ресурса, его можно использовать для получения загруженного контента, в методе contentById
  3. parameters – Параметры загрузки, здесь можно передать как Object, так и экземпляр класса FPLoadParameters

Параметр parameters метода add, может получать экземпляр Object со следующими полями:

  • force:Bolean – Начать загрузку немедленно. Ресурс начинает грузится сразу, даже если количество текущих поток равно streamCount
  • contentType:String – тип загрузки, может принимать одно из значений класса FPContentTypes
  • context:LoaderContext – Контекст загрузки, если загружается SWF
  • className:String – Имя класса, экземпляр которого необходимо создать, после загрузки флешки
  • size:uint – Размер загружаемого файла в байтах.

Класс FPLoadParameters также имеет все эти поля, и метод clone, для создания копии объекта с параметрами:

Смысл параметра contentType класса FPLoadParameters в том, что бы указать загрузчику тип загружаемого контента, если определить тип автоматически не удалось. Например если вы загружаете файл с расширением .png, .jpg, .gif – загрузчик автоматически определяет тип контента как FPContentTypes.IMAGE, и после загрузки ресурса, в свойстве .content вы получите объект BitmapData. Если же вы загружаете картинку с другим расширением(например если картинку вам возвращает php-скрипт), загрузчик не сможет идентифицировать этот ресурс как изображение, в этом случае необходимо в методе add в параметрах указать значение FPContentTypes.IMAGE в свойстве contentType. Или другой пример, если вы хотите загрузить все изображения(или любой другой ресурс) в виде ByteArray, то можно задать значение FPContentTypes.BYTES.

Обратите внимание, что в выше указанном коде, мы один и тот же объект param:FPLoadParameters передаем во всех вызовах метода add, изменив только параметр size. Можно не переживать по этому поводу, т.к. внутри метода add сохраняется копия этого объекта, сделанная методом FPLoadParameters.clone().


Закрыть Описание метода FPLoader.add(…)

Использование IFPResource

Метод add возвращает экземпляр IFPResource – это объект, который непосредственно загружает текущий ресурс. Также его можно получить у объект FPLoader, используя методы resourceById и resourceBySrc.

Помимо глобальных событий FPLoaderEvent.PROGRESS_ALL и FPLoaderEvent.COMPLETE_ALL, класс FPLoaderEvent имеет следующие события:

  • FPLoaderEvent.START – началась загрузка ресурса
  • FPLoaderEvent.COMPLETE – завершилась загрузка ресурса
  • FPLoaderEvent.PROGRESS – прогресс загрузки ресурса
  • FPLoaderEvent.UNLOAD – ресурс выгружен, например по требованию в методе unload

У этих событий имеются параметры:

  • errorType:String – Ошибки загрузки, может принимать одно из значений FPErrorTypes. Подробно про ошибки читайте чуть ниже
  • id:String – Идетификатор ресурса, который является инициатором данного события
  • src:String – Ссылка на ресурс
  • bytesLoaded:Number – загруженные байты
  • bytesTotal:Number – размер файла

Параметры id и src необходимы для определения ссылки на объект IFPResource, и получения контента:

Загрузка флешек и создание экземпляров из библиотеки

Если вам необходимо загрузить swf-библиотеку и создать экземпляр, вы можете использовать параметр className класса FPLoadParameters в методе FPLoader.add():

Обратите внимание что метод add был вызван два раза с одинаковой ссылкой pack.swf, но с разными значениями className. В этом случае реальный загрузчик(объект Loader) создается только один(!) и файл загружается один(!) раз. При этом создаются два объекта IFPResource, и эти объекты генерируют события FPLoaderEvent синхронно.

Внимание! В выше указанном примере, метод add вызывается два раза с одинаковыми ссылками, это значит что методы FPLoader.resourceBySrc и FPLoader.contentBySrc вернут информацию по ресурсу созданному последним, поэтому для получения правильной ссылки на IFPResource, и для получения нужного контента, рекомендуется использовать идентификатор id и методы FPLoader.resourceById, FPLoader.contentById:

Если попытаться загрузить флешку без параметра className, то в свойстве IFPResource.content и методах FPLoader.contentById/FPLoader.contentBySrc вы получите ссылку на визуальный объект который лежит на Timeline-e. Если вам нужно получить объект LoaderInfo загруженной флешки, вы можете воспользоваться свойством IFPResource.loaderInfo. Если была загружена не флешка, свойство IFPResource.loaderInfo содержит значение null.

Загрузка списка ресурсов с размерами и антикешом

Как я показал в первом примере, если загружать несколько ресурсов одновременно, свойство FPLoader.progress показывает общий процент загрузки ресурсов. Подсчет происходит по следующей формуле:

, где:

  • allCount – Общее количество ресурсов заданных загрузчику
  • finishCount – Количество уже загруженных ресурсов
  • percent1,percent2,…,percentN – проценты загруженности(от 0 до 1) тех ресурсов, которые загружаются в данный момент

Вроде бы все хорошо, но есть одна проблема. Представим что у нас загружаются два ресурса, один весит 10кб, а другой 10 Мб. В этом случае после загрузки первого файла(10кб) загрузчик покажет общий процент загруженности 50%, и в процессе загрузки второго файла(10мб) будет постепенно отображать процент от 50% до 100%, получается что первые 50% мы увидим практически мгновенно, а вторая половина будет загружаться в 10 раз дольше. Это происходит потому что, в момент загрузки первого файла, загрузчик ничего не знает о размере остальных файлов в очереди, и не может правильно оценить процент загрузки. Вот пример того, как это будет выглядеть во флешке:

Здесь должна быть флешка. Установите Flash Player

В этом коде сперва загружается текстовый файл, который весит 11 байт, а затем картинка – 9 МБ.

Для решения этой проблемы в загрузчике FPLoader предусмотрен механизм загрузки списка файлов с размерами всех файлов. Загрузить список файлов можно с помощью метода FPLoader.loadFilelist. Вот как будет работать флешка, которая перед загрузкой ресурсов, загружает файл со списком этих ресурсов:

Здесь должна быть флешка. Установите Flash Player


Ну и собственно код:

Как видите, добавилась только одна строчка(№33), с вызовом метода loadFilelist. Файл со списком ресурсов по умолчанию должен выглядеть так:

, где:

  • src:String – Ссылка на ресурс
  • size:Number – Размер файла в байтах
  • version:String – Версия файла для нормального кеширования файла

Данный файл содержит информацию о размерах всех загружаемых ресурсов и версию файла. Версия файла нужна для организации антикеша, этот параметр добавляется к концу ссылки и таким образом ресурс кешируется в браузере с текущей версией, если версия файла изменится, браузер скачает новую, обновленную версию файла.

Если вас не устраивает формат данного XML-файла, вы можете создать свой собственный. Для парсинга собственного формата файла со списком ресурсов, вам необходимо переопределить protected метод FPLoader.createFilelist. Этот метод должен вернуть объект класса FPFilelist, внутри которого вы можете написать свой собственный парсер, переопределив метод parse. Метод FPFilelist.parse должен вернуть массив(Vector) элементов FPFileInfo.

Имейте ввиду: если был вызван метод FPLoader.loadFilelist, и сразу после него FPLoader.start, то ресурсы не будут загружаться до тех пор, пока не закончится загрузка файла со списком ресурсов.

Работа с ошибками

В загрузчике определены несколько типов ошибок, полный список можно увидеть в документации к классу FPErrorTypes. В случае возникновения ошибки, загрузчик генерирует исключение throw error:FPLoaderError. Если вы не хотите получать исключения, необходимо объект FPLoader подписать на событие FPLoaderErrorEvent. Объект события FPLoaderErrorEvent имеет параметр errorType, который может принимать одно из значений класса FPErrorTypes. Также параметр errorType имеется у объектов IFPResource, используя этот параметр, вы сможете определить была ли ошибка в момент загрузки конкретного ресурса, если ошибок нет, параметр IFPResource.errorType равен null.

Статистика загрузки

Объекты IFPresource, имеют свойство statistics:FPStatistics – которое содержит информацию по статистике загрузки. Класс FPStatistics имеет следующие свойства:

  • bytesLoaded:Number – Количество загруженных байт
  • bytesTotal:Number – Размер файла
  • startTime:Number – Локальное время unixtime(в миллисекундах), когда началась загрузка
  • finishTime:Number – Время unixtime(в миллисекундах) окончания загрузки. Если ресурс еще не загружен, то finishTime покажет текущее время
  • duration:Number – Длительность загрузки, разница finishTime и startTime
  • speedHistory:Vector. – История скорости загрузки
  • minSpeed:Number – Минимальная скорость загрузки
  • maxSpeed:Number – Максимальная скорость загрузки

и одну функцию:

  • speed(iterations:int=100):Number – Средняя скорость загрузки ресурса

Параметры bytesLoaded и bytesTotal имеют те же значения, что аналогичные свойства объекта IFPResource. Массив speedHistory содержит в себе элементы FPHistoryIteration которые создаются в каждом событии Event.ENTER_FRAME с момента начала и до окончания загрузки файла. Объекты FPHistoryIteration содержат в себе разницу во времени и количестве загруженных байт с моменты предыдущего события Event.ENTER_FRAME. Параметры minSpeed и maxSpeed содержат минимальную и максимальную скорости в пределах одной итерации (одна итерация – между двумя событиями Event.ENTER_FRAME). Функция speed возвращает среднее значение скорости используя последние итерации в количестве равное параметру iterations.

Скачать библиотеку FPLoader а также почитать документацию можно в разделе Библиотеки SWC. На момент написания статьи, текущая версия библиотеки: 0.1.4.

Не забывайте оставлять комментарии, и удачной вам загрузки :) !

Да прeбудет с вами Flash.
Serious Sam
Эту статью прочитали 2040 раз

Возникли вопросы по статье? Не стесняйтесь спрашивать в комментариях или любым другим способом на странице Контакты .

Присоединяйтесь к нам в социальных сетях: ВКонтакте , Twitter и Facebook
Понравилась статья? Буду благодарен если вы поделитесь ссылкой с друзьями:


Комментарии ВКонтакте:




Комментарии Facebook:




Комментарии WordPress: