<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Hello World: &#187; BulkLoader</title>
	<atom:link href="http://razorblade.netsons.org/category/actionscript/bulkloader/feed/" rel="self" type="application/rss+xml" />
	<link>http://razorblade.netsons.org</link>
	<description>Programmazione web e oltre: php5, Zend Framework, jQuery, Actionscript 3.0, Sandy 3D Engine e altro</description>
	<lastBuildDate>Fri, 28 Aug 2009 18:23:41 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.4</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Preload avanzato con BulkLoader ed Actionscript 3.0</title>
		<link>http://razorblade.netsons.org/2008/09/24/preload-avanzato-con-bulkloader-ed-actionscript-30/</link>
		<comments>http://razorblade.netsons.org/2008/09/24/preload-avanzato-con-bulkloader-ed-actionscript-30/#comments</comments>
		<pubDate>Wed, 24 Sep 2008 20:03:05 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[Actionscript]]></category>
		<category><![CDATA[BulkLoader]]></category>
		<category><![CDATA[Actionscript 3.0]]></category>
		<category><![CDATA[as3]]></category>
		<category><![CDATA[flash]]></category>
		<category><![CDATA[LazyXMLLoader]]></category>
		<category><![CDATA[preload]]></category>

		<guid isPermaLink="false">http://razorblade.netsons.org/?p=37</guid>
		<description><![CDATA[<h2>Bulkloader</h2>
<p>BulkLoader è una libreria minimale scritta in Actionscript 3.0 da Arthur Debert, potete scaricarla <a href="http://code.google.com/p/bulk-loader/" title="bulkloader download">qui</a>.</p><p>

</p><p>Questa libreria ci permette di caricare files esterni all'interno dei nostri swf ed avere un gran numero di informazioni su questi, come per esempio il totale complessivo di files e di bytes, il totale in bytes del file attualmente in fase di caricamento, il loro nome e così via. Inoltre è possibile utilizzare un file xml per definire i file da caricare utilizzando la classe LazyXMLLoader.</p>

<p>Ed è proprio questa classe che tratteremo in questo tutorial, con la quale <a href="http://razorblade.netsons.org/2008/09/24/preload-avanzato-con-bulkloader-ed-actionscript-30/">[...] Continua</a></p>


Related posts:<ol><li><a href='http://razorblade.netsons.org/2008/12/28/muovere-uno-sprite-usando-la-tastiera-con-actionscript-30/' rel='bookmark' title='Permanent Link: Muovere uno sprite usando la tastiera con Actionscript 3.0'>Muovere uno sprite usando la tastiera con Actionscript 3.0</a> <small>Muoviamo un oggetto alla pressione dei tasti. In questo articolo...</small></li><li><a href='http://razorblade.netsons.org/2009/01/09/personalizzare-il-puntatore-del-mouse-con-actionscript-30/' rel='bookmark' title='Permanent Link: Personalizzare il puntatore del mouse con Actionscript 3.0'>Personalizzare il puntatore del mouse con Actionscript 3.0</a> <small>Usando la classe Custom Mouse Pointer Per le nostre applicazioni...</small></li></ol>

Related posts brought to you by <a href='http://mitcho.com/code/yarpp/'>Yet Another Related Posts Plugin</a>.]]></description>
			<content:encoded><![CDATA[<h2>Bulkloader</h2>
<p>BulkLoader è una libreria minimale scritta in Actionscript 3.0 da Arthur Debert, potete scaricarla <a href="http://code.google.com/p/bulk-loader/" title="bulkloader download">qui</a>.</p>
</p>
<p>Questa libreria ci permette di caricare files esterni all&#8217;interno dei nostri swf ed avere un gran numero di informazioni su questi, come per esempio il totale complessivo di files e di bytes, il totale in bytes del file attualmente in fase di caricamento, il loro nome e così via. Inoltre è possibile utilizzare un file xml per definire i file da caricare utilizzando la classe LazyXMLLoader.</p>
<p>Ed è proprio questa classe che tratteremo in questo tutorial, con la quale realizzeremo un preload NON formattato graficamente ma in cui ricaveremo e visualizzeremo tutte le informazioni che ci servono per arrivare al nostro scopo: creare 2 barre di scorrimento, una rappresentante il totale complessivo dei bytes scaricati, ed una rappresentante il totale dei bytes scaricati per il file attualmente in fase di scaricamento.</p>
<p>Una note prima di procedere con la spiegazione riguardante il codice: ricordatevi di importare le librerie in flash come ho spiegato <a href="http://razorblade.netsons.org/2008/09/08/flash-sandy-3d-engine-con-actionscript-30/">qui</a> altrimenti potrete ricevere diversi errori.</p>
<p>Il seguente è il file xml in cui diremo a BulkLoader dove andare a prendere i dati necessari. In questo caso tutti i file da caricare sono nella directory assets\files.</p>
<p><b>lazyloader.xml</b></p>
<pre name="code" class="xml">
&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;BulkLoader&gt;
	&lt;name&gt;BulkLoader&lt;/name&gt;
	&lt;stringSubstitutions&gt;
		&lt;base_path&gt;assets/files/&lt;/base_path&gt;
	&lt;/stringSubstitutions&gt;

	&lt;files&gt;
		&lt;file&gt;
			&lt;url&gt;{base_path}movie.flv&lt;/url&gt;
      &lt;id&gt;moviee&lt;/id&gt;
			&lt;pausedAtStart&gt;true&lt;/pausedAtStart&gt;
			&lt;checkPolicyFile&gt;true&lt;/checkPolicyFile&gt;
			&lt;maxTries&gt;5&lt;/maxTries&gt;
      &lt;priority&gt;90&lt;/priority&gt;
		&lt;/file&gt;
		&lt;file&gt;
			&lt;url&gt;{base_path}sound-short.mp3&lt;/url&gt;
			&lt;id&gt;the-sound&lt;/id&gt;
      &lt;priority&gt;80&lt;/priority&gt;
		&lt;/file&gt;
		&lt;file&gt;
			&lt;url&gt;{base_path}duskclear2.jpg&lt;/url&gt;
			&lt;id&gt;duskclear2&lt;/id&gt;
      &lt;priority&gt;70&lt;/priority&gt;
		&lt;/file&gt;
		&lt;file&gt;
			&lt;url&gt;{base_path}testo.txt&lt;/url&gt;
			&lt;id&gt;testo&lt;/id&gt;
      &lt;priority&gt;50&lt;/priority&gt;
		&lt;/file&gt;
		&lt;file&gt;
			&lt;url&gt;{base_path}samplexml.xml&lt;/url&gt;
			&lt;id&gt;samxml&lt;/id&gt;
			&lt;headers&gt;
				&lt;header1&gt;value1&lt;/header1&gt;
				&lt;header2&gt;value2&lt;/header2&gt;
			&lt;/headers&gt;
      &lt;priority&gt;40&lt;/priority&gt;
		&lt;/file&gt;
	&lt;/files&gt;
&lt;/BulkLoader&gt;
</pre>
<p>Ogni file è contenuto all&#8217;interno del tag <strong>file</strong>, questo deve includere quanto meno la url del file. Pur esistendo la possibilità di creare un id univoco per il ogni file senza bisogno di specificarlo, ho preferito inserire il tag <strong>id</strong> manualmente per ogni file. Questo campo è importante in quanto identifica in modo univoco il nostro file. Possono essere incluse diverse altre informazioni per i file e nell&#8217;intestazione del XML, ma per questo vi rimando alla documentazione ufficiale.</p>
<p><b>BulkLoaderMain</b></p>
<pre name="code" class="php">
  package{
    import br.com.stimuli.loading.lazyloaders.LazyXMLLoader;
    import br.com.stimuli.loading.lazyloaders.LazyBulkLoader;
    import br.com.stimuli.loading.*;
    import br.com.stimuli.loading.loadingtypes.*;
    import br.com.stimuli.loading.BulkProgressEvent;

    import flash.events.*;
    import flash.display.*;
    import flash.media.Sound;
    import flash.media.Video;
    import flash.net.NetStream;
    import flash.text.*;
    import flash.events.MouseEvent;

    public class BulkLoaderMain extends Sprite {
      public var lazyTotal:LazyXMLLoader;
      public var lazy:LazyXMLLoader;

      public var inizio:TextField;
      public var bytesLoaded:TextField;
      public var percentuale:TextField;
      public var itemsLoaded:TextField;
      public var currentLoaded:TextField;
      public var totalItems:TextField;
      public var fine:TextField;

      public var barTotal:TextField;
      public var barItem:TextField;

      public var bytesTotali:Number = 0;
      public var filesTotali:Number = 0;
      public var bytesCaricati:Number = 0;

      public var hide:Boolean = false;

      public function BulkLoaderMain():void {
        addTextFields();
        inizio.text = "Clicca qui per iniziare il preload!";
        inizio.addEventListener(MouseEvent.CLICK,start);
      }

      public function start( e : MouseEvent ):void {
        inizio.removeEventListener(MouseEvent.CLICK,start);
        /*
        bytesTotal = Se il numero delle connessioni è minore del numero dei files sarà uguale a 0
        bytesTotalCurrent	= Se il numero delle connessioni è maggiore del numero dei files sarà = a bytesTotal
        */
        lazyTotal  = new LazyXMLLoader("assets/files/lazyloader.xml", "getTotalLazyLoader", 10, 10);
        lazyTotal.addEventListener(ProgressEvent.PROGRESS, onAllProgressTotal);
        lazyTotal.addEventListener(Event.COMPLETE, onAllLoadedTotal);
        lazyTotal.start();
      }

      private function onAllProgressTotal( e : BulkProgressEvent ):void {
        if(e.bytesTotal > bytesTotali){
          bytesTotali = e.bytesTotal;
          filesTotali = e.itemsTotal;
          bytesLoaded.text = "Bytes Totali "+bytesTotali;
          percentuale.text = "Files Totali "+filesTotali;
          /*var evn:BulkProgressEvent;
          for each(var item : LoadingItem in lazyTotal.items){
            evn = lazyTotal.getProgressForItems([item.id]);
            totalItems.appendText(item+"\n");
            totalItems.appendText(item.id+" Caricati "+evn.bytesLoaded+" su "+evn.bytesTotal+"\n");
          }*/
          lazyTotal.removeAll();
          lazyTotal.clear();
          lazyTotal = null;
        }
      }

      private function addTextFields():void{
        inizio = createTextField(10, 10, 400, 100);
        bytesLoaded = createTextField(10, 30, 400, 100);
        percentuale = createTextField(10, 50, 400, 100);
        itemsLoaded = createTextField(10, 70, 400, 100);
        currentLoaded = createTextField(10, 90, 400, 100);

        totalItems = createTextField(10, 170, 400, 300);
        totalItems.wordWrap = true;
        totalItems.background = true;
        totalItems.backgroundColor = 0xF3C9F8;

        barItem = createTextField(10, 110, 0, 20);
        barItem.background = true;
        barItem.backgroundColor = 0x4EF580;

        barTotal = createTextField(10, 140, 0, 20);
        barTotal.background = true;
        barTotal.backgroundColor = 0x4EF580;

        fine = createTextField(10, 510, 400, 100);
      }

      function onAllLoadedTotal(evt : Event) : void{
        lazy  = new LazyXMLLoader("assets/files/lazyloader.xml", "theLazyLoader", 1, 10);
        lazy.addEventListener(LazyBulkLoader.LAZY_COMPLETE, onLazyInfoLoaded );
        lazy.addEventListener(Event.COMPLETE, onAllLoaded);
        lazy.addEventListener(ProgressEvent.PROGRESS, onAllProgress);
        lazy.start();
      }

      private function createTextField(x:Number, y:Number, width:Number, height:Number):TextField {
        var result:TextField = new TextField();
        result.x = x;
        result.y = y;
        result.width = width;
        result.height = height;
        addChild(result);
        return result;
      }

      public function onLazyInfoLoaded( e : Event ):void {
        inizio.text = "File XML letto con successo!";
      }

      public function onAllProgress( e : BulkProgressEvent ):void {
        bytesCaricati = 0;
        var evn:BulkProgressEvent;
        totalItems.text = "Oggetti totali "+lazy.totalWeight+" \n";
        for each(var item : LoadingItem in lazy.items){
          evn = lazy.getProgressForItems([item.id]);
          totalItems.appendText(item+"\n");
          totalItems.appendText(item.status+"\n");
          totalItems.appendText(item.id+" Caricati "+evn.bytesLoaded+" su "+evn.bytesTotal+"\n");
          bytesCaricati+= item.status == 'started' ? evn.bytesLoaded : evn.bytesTotal;
          if(evn.bytesLoaded >= 0 &#038;&#038; evn.bytesLoaded != evn.bytesTotal){
            itemsLoaded.text = "Percentuale "+item.id+" "+evn.bytesLoaded*100/evn.bytesTotal;
            barItem.width = Math.round(evn.bytesLoaded*100/evn.bytesTotal)*3;
            barItem.text = hide === false ? "Currently Loading "+item.url.url : "";
          }
        }
        bytesLoaded.text = "Totale Caricati "+bytesCaricati+" su "+bytesTotali;
        percentuale.text = "Totale Percentuale "+bytesCaricati*100/bytesTotali;
        barTotal.width = Math.round(bytesCaricati*100/bytesTotali)*3;
        barTotal.text = hide === false ? "Total Loading" : "";
        hide = !hide;
      }

      function onAllLoaded(evt : Event) : void{
        barTotal.width = 300;
        barItem.width = 300;
        fine.text = "Caricamento Terminato! \n";
        fine.appendText("Clicca QUI per visualizzare il contenuto");
        fine.addEventListener(MouseEvent.CLICK,clickListener);
      }

      function clickListener( e : MouseEvent ):void {
        var xPos : int = 450;
        var yPos : int = 0;
        for each (var item : LoadingItem in lazy.items){
          if (item.isImage()){
            var b : Bitmap = lazy.getBitmap(item.id);
            addChild(b);
            if (b.width > 300){
              b.width = 300;
              b.scaleY = b.scaleX;
              b.x = xPos;
              b.y = yPos;
              xPos += b.width + 10;
              if(xPos > 800){
                xPos = 200;
                yPos += 200;
              }
            }
          }else if (item.isSound()){
            var sound : Sound = lazy.getSound(item.id);
            sound.play();
          }else if(item.isStreamable()){
            var video : Video = new Video();
            var theNetStream : NetStream = lazy.getNetStream(item.id);
            addChild(video);
            video.attachNetStream(theNetStream);
            theNetStream.resume();
            video.y = 300;
            video.x = 450;
          }
        }
        fine.removeEventListener(MouseEvent.CLICK,clickListener);
      }
    }
  }
</pre>
<p>Il contenuto di questo file è piuttosto lungo, occhio a non perdervi! I vari <strong>import</strong> importano all&#8217;interno della classe tutte le librerie built in di flash e le librerie di bulLloader che saranno utilizzate nel corso dello script.</p>
<p>Quindi inizializzeremo tutte le <strong>proprietà</strong> che utilizzeremo globalmente all&#8217;interno della classe, ovvero le due istanze di LazyXMLLoader ( più avanti spiegherò il perchè di 2 istanze ), tutti i TextField atti a visualizzare tutte le informazioni che ci servono, tra cui, gli ultimi 2, che saranno le nostre barre di caricamento, 3 proprietà numeriche: bytesTotali, filesTotali e bytesCaricati, che terranno in memoria il totale complessivo degli omonimi valori e una variabile booleana hide, utilizzata per un semplice effetto visivo.</p>
<h2>Il costruttore</h2>
<p>Il costruttore aggiunge i vari textfield posizionati ed un minimo formattati tramite il metodo addTextFields(). Quindi mette in ascolto l&#8217;evento click con il textfield in modo che il caricamento abbia inizio una volta cliccato il testo.</p>
<h2>Ready? GO!</h2>
<p>Effettuato il click sul textfield inizia il caricamento vero e proprio. Il metodo start() istanzia lazyTotal, la prima delle due istanze di LazyXMLLoader. <strong>Perchè due istanze</strong>? Cercando di arrivare allo scopo delle 2 barre ho incontrato 1 problema strettamente legato al numero delle connessioni e alla disponibilità di alcuni dati, ovvero:</p>
<ul class='listato'>
<li><strong>bytesTotal </strong>= Se il numero delle connessioni è minore del numero dei files sarà uguale a 0</li>
<li><strong>bytesTotalCurrent</strong>	= Se il numero delle connessioni è maggiore del numero dei files sarà = a bytesTotal</li>
</ul>
<p>Che cosa è il numero delle connessioni? Il numero delle connessioni, ovvero il terzo argomento del costruttore di LazyXMLLoader, in parole molto semplici, definisce quanti file possono essere scaricati in contemporanea.</p>
<h2>Il problema</h2>
<p>Mettendo un numero di connessioni maggiore del numero dei files abbiamo il numero dei bytes totali ma non possiamo scaricare i files uno alla volta e vedere nel dettaglio il loro andamento. Con un numero di connessioni uguale ad 1 possiamo vedere procedere il caricamento dei files uno alla volta, ma così facendo non abbiamo il numero totale dei bytes che ci serve per creare la barra sul totale.</p>
<h2>La possibile soluzione</h2>
<p>Una possibile soluzione che mi è venuta in mente è stata la creazione di una istanza di LazyXMLLoader con un numero di connessioni maggiore del numero dei files. Una volta che questa è in grado di darci le informazioni sul totale bytes e totale files, viene subito chiusa e rimossa e viene fatta partire la seconda istanza in cui specificheremo 1 come numero di connessioni, che effettuerà il caricamento vero e proprio. I dati sul totale bytes ci vengono restituiti dalla prima istanza praticamente subito, testato con la simulazione di scaricamento a 56 kbps non sono occorsi più di 5 o 6 secondi, il tempo di scaricare il file lazyloader.xml. Il metodo incaricato di recuperare i bytes totali e bloccare il primo loader è onAllProgressTotal. </p>
<p>Quindi, avvenuto il dispatch dell&#8217;evento LAZY_COMPLETE viene richiamato il metodo onAllLoadedTotal che istanzia il secondo loader. Il grosso del lavoro sarà adesso eseguito dal metodo onAllProgress, che ci aggiornerà sul progresso del file attualmente caricato e sull&#8217;andamento globale.</p>
<p>Terminato il caricamento dei dati, questi potranno essere visualizzati tramite il click sul testo che avverte del termine del caricamento. Cliccate <a href="http://razorblade.netsons.org/flash/tutorial003/bulkLoader.swf">qui</a> per visualizzare il risultato ( il download dei file potrebbe richiedere molto tempo dipendentemente dalla vostra connessione): </p>
<p>Si conclude qui questo tutorial, siete invitati a testare il codice postato e lasciare i vostri commenti.</p>
<div class="ratings">Note: There is a rating embedded within this post, please visit this post to rate it.</div>


<p>Related posts:<ol><li><a href='http://razorblade.netsons.org/2008/12/28/muovere-uno-sprite-usando-la-tastiera-con-actionscript-30/' rel='bookmark' title='Permanent Link: Muovere uno sprite usando la tastiera con Actionscript 3.0'>Muovere uno sprite usando la tastiera con Actionscript 3.0</a> <small>Muoviamo un oggetto alla pressione dei tasti. In questo articolo...</small></li><li><a href='http://razorblade.netsons.org/2009/01/09/personalizzare-il-puntatore-del-mouse-con-actionscript-30/' rel='bookmark' title='Permanent Link: Personalizzare il puntatore del mouse con Actionscript 3.0'>Personalizzare il puntatore del mouse con Actionscript 3.0</a> <small>Usando la classe Custom Mouse Pointer Per le nostre applicazioni...</small></li></ol></p>
<p>Related posts brought to you by <a href='http://mitcho.com/code/yarpp/'>Yet Another Related Posts Plugin</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://razorblade.netsons.org/2008/09/24/preload-avanzato-con-bulkloader-ed-actionscript-30/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
