AS3 BulkLoader Useful Flash Asset Loading Kit by Arthur Debert
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!
