Found via Zeh, this great bulk loading kit for AS3 from Arthur Debert.
AS3 Loaders are very useful, but when you have large projects there is always a pause and focus on loading scenarios and architecture needed for your loading scenarios, sometimes this can literally eat days and entirely change performance with wrong moves. BulkLoader is a well written kit from Authur Debert that makes loading scenarios or using BulkLoader as a base to your loading situations a great pluggable piece of code that has many excellent features.
Some of the calls like BulkLoader.getLoader(“main-site”).getContent(“bg”), are also very similar to Silverlight’s downloader object that can be queued like this. All in all a kit that is very useful that I have already put to work and will help teams standardize on bulk loading for those killer flash apps.
- BulkLoader at Google Code
- Credits
- DeveloperGuide
- GettingStarted
- ProjectStatus
Creating a BulkLoader instance
// creates a BulkLoader instance with a name of "main-site", that can be used to retrieve items without having a reference to this instance
var loader : BulkLoader = new BulkLoader("main-site");
Add urls to load
// simplest case:
loader.add("logo.png");
// use an "id" so the item can be retrieved later without a reference to the url
loader.add("background.jpg", {id:"bg"});
// since the url by itself can't tell us what the filetype is, use the type property to let BulkLoader know what to do:
loader.add("/some-web-services?size=Large", {type:"image"});
// add an item that should be loaded first (higher priority):
loader.add("/data/config.xml", {priority:20});
// add a max try number (defaults to 3)
loader.add("/unreliable-web-services.xml", {maxTries:6});
// you can also use a URLRequest object , this will load from a POST request
var postRequest : URLRequest = new URLRequest("/save-prefs.php");
postRequest.method = "POST";
var postData : URLVariables = new URLVariables(myPostDataObject );
postRequest.data = postData;
loader.add(postRequest, {"id":"settings"});
// of course, all options can be combined:
loader.add("the-sound-webservices?name=maintrack", {"id":"soundtrack", type:"sound", maxTries:1, priority:100});
Listening for events
// simplest case:
loader.add("logo.png");
// use an "id" so the item can be retrieved later without a reference to the url
loader.add("background.jpg", {id:"bg"});
// since the url by itself can't tell us what the filetype is, use the type property to let BulkLoader know what to do:
loader.add("/some-web-services?size=Large", {type:"image"});
// add an item that should be loaded first (higher priority):
loader.add("/data/config.xml", {priority:20});
// add a max trie number (defaults to 3)
loader.add("/unreliable-web-services.xml", {maxTries:6});
// you can also use a URLRequest object , this will load from a POST request
var postRequest : URLRequest = new URLRequest("/save-prefs.php");
postRequest.method = "POST";
var postData : URLVariables = new URLVariables(myPostDataObject );
postRequest.data = postData;
loader.add(postRequest, {"id":"settings"});
// of course, all options can be combined:
loader.add("the-sound-webservices?name=maintrack", {"id":"soundtrack", type:"sound", maxTries:1, priority:100});
Listening for events:
// attaching events to all items:
// this will fire once all items have been loaded
loader.addEventListener(BulkLoader.COMPLETE, onAllLoaded);
// this will fire on progress for any item
// the event , BulkProgress is a subclass of ProgressEvent (with extra information)
loader.addEventListener(BulkLoader.PROGRESS, onAllProgress);
// this will fire if any item fails to load:
// the event is BulkErrorEvent and holds an array (errors) with all failed LoadingItem instances
loader.addEventListener(BulkLoader.ERROR, onAllError);
// you can also listen to events in individual items
// this will fire as soon as the item registred with the id of "bg" is done loading (even if there are other items to load)
loader.get("bg").addEventListener(Event.COMPLETE,onBackgroundLoaded)
// this will only trigged if the config.xml loading fails:
loader.get("data/config.xml").addEventListener(BulkLoader.ERROR, onXMLFailed);
Starting the loading operation
BulkLoader will only begin loading once you call the start method:
loader.start();
Retrieving content
var theBgBitmap : Bitmap = loader.getContent("bg") as Bitmap;
// you don't need to keep a reference to the loader intance, you can get it by name:
var theBgBitmap : Bitmap = BulkLoader.getLoader("main-site").getContent("bg") as Bitmap;
// you can also use the conviniece methods to get a typed object:
var theBgBitmap : Bitmap = loader.getBitmap("bg");
// grab a BitmapData directly:
var theBgBitmap : Bitmap = loader.getBitmapData("bg");
Other convenience functions: getXML, getText, getNetStream, getSound, getMovieClip, getNetStreamMetaData.
You can retrieve an item using it’s id, it’s url as a String or as the URLRequest object (if the item was created with an URLRequest).
Arthur also has experience on Tweener so making simplified calls and minimalist code to make a library successful is very clear in the notes/goals on the project and the resulting code:
BulkLoader is a minimal library written in Actionscript 3 (AS3) that aims to make loading and managing complex loading requirements easier and faster. BulkLoader takes a more dynamic, less architecture heavy aproach. Few imports and making heavy use of AS3′s dynamic capabilities, BulkLoader has a one-liner feel that doesn’t get your way.
BulkLoader tries to hide the complexity of loading many data types in AS3, providing a unified interface for loading, accessing and events notification for different types of content.
This library is licensed under an open source MIT license.
Features:
- Connection pooling.
- Unified interface for different loading types.
- Unified progress notification.
- Events for individual items and as groups.
- Priority
- Stop and resuming individually as well as in bulk.
- Cache managing.
- Statistics about loading (latency, speed, average speed).
- Multiple kinds on progress indication: ratio (items loaded / items to load), bytes , and weighted percentage.
- Multiple number of retries.
- Configurable logging.
Design goals:
- Minimal imports.
- Few method to learn.
- Dynamic nature: items can be added by specifying a url as a String or a URLRequest .
- Items can be assigned an identifier key to be used on retrieval.
- Only one class to learn / use.
BulkLoader tries to gracefully handle progress notification in these use cases:
- Few connections to open: bytes total can be used instantly.
- Many connections opened: progress by ratio
- Many connections opened for data of widely varying sizes: progress by weight.
This is quite a contribution to the flash community and is a perfect candidate for the base of your loading assets projects and scenarios. Thanks Arthur!