2010-12-14 9 views
1

Verwenden von Flash Builder 4 mit flex 4.1. Ich habe eine Luft-App, die Dateien herunterlädt, die in einem Array angegeben sind. Ich versuche, den Status zu ändern, nachdem die Dateien auf dem Datenträger geschrieben wurden.Warten, bis die Array-Funktion beendet ist:

Die Funktion finalscreen wird aufgerufen, bevor die Dateien heruntergeladen sind. Dies ist offensichtlich mit der großen Videodatei, die ich anlegte, um es zu testen.

<fx:Script> 
    <![CDATA[ 
     function finalscreen() 
     { 
      this.currentState="Finished"; 
     }  
     private function initiate_download(event:MouseEvent):void 
     { 
      this.currentState="Working"; 
      var filearray:Array = new Array(); 
      filearray[0]="0.jpg"; 
      filearray[1]="1.jpg"; 
      filearray[2]="2.jpg"; 
      filearray[3]="3.jpg"; 
      filearray[4]="4.jpg"; 
      filearray[5]="5.jpg"; 
      filearray[6]="6.jpg"; 
      filearray[7]="7.jpg"; 
      filearray[8]="8.jpg"; 
      filearray[9]="9.jpg"; 
      filearray[10]="10.jpg"; 
      filearray[11]="1.avi"; 
      for (var i:uint; i < filearray.length; i++) { 
       var remoteURL = "http://domain/dir/" + filearray[i]; 
       var localURL = "C:/dir/" + filearray[i]; 
       downloadFile(remoteURL, localURL); 
      } 
    finalscreen(); 

      function downloadFile(url, filename) 
      { 
       // Create the stream for the data request 
       var urlStream = new URLStream(); 

       // Used to initiate request for remote file 
       var request = new URLRequest(url); 

       // Create file stream 
       var fileStream = new FileStream(); 

       // Create a reference to a location on disk 
       var file = File.desktopDirectory.resolvePath(filename); 

       // Called as download progresses 
       var writeFile = function() 
       { 
        // Write to file 
        if (urlStream.bytesAvailable > 51200) 
        { 
         var dataBuffer = new ByteArray(); 
         urlStream.readBytes(dataBuffer, 0, urlStream.bytesAvailable); 
         fileStream.writeBytes(dataBuffer, 0, dataBuffer.length); 
        } 
        return true; 
       } 

       // Called when download completes 
       var finishWriteFile = function() 
       { 
        // Write to file 
        if(urlStream.bytesAvailable > 0) 
        { 
         var dataBuffer = new ByteArray(); 
         urlStream.readBytes(dataBuffer, 0, urlStream.bytesAvailable); 
         fileStream.writeBytes(dataBuffer, 0, dataBuffer.length); 
        } 

        // Close streams 
        fileStream.close(); 
        urlStream.close(); 
        return true; 
       } 

       // Initiate download 
       fileStream.open(file, FileMode.WRITE); 
       urlStream.load(request); 

       // Add event listeners 
       urlStream.addEventListener(Event.COMPLETE, finishWriteFile); 
       urlStream.addEventListener(ProgressEvent.PROGRESS, writeFile); 
      } 
    } 
    ]]> 
</fx:Script> 

<fx:Declarations> 
    <!-- Place non-visual elements (e.g., services, value objects) here --> 
</fx:Declarations> 

<s:states> 
    <s:State name="Start"/> 
    <s:State name="Working"/> 
    <s:State name="Finished"/> 
</s:states> 

Vielen Dank!

+0

Ok, ich habe die Array-Schleife auf die ersten 11 mit diesem und beschränkt Messing und verließ die letzte Funktion „Duplizieren“ a nennen Das hat am Ende einen Zustandswechsel, aber wegen Async-Schreiben funktioniert es nicht gut. Ich habe FileStream von openasync so geändert, dass es nur geöffnet wird und versuchen, die Dateien nacheinander herunterzuladen, aber das wird es verlangsamen. – mubhcaeb

+0

Fast schon! Der offene Modus wurde auf UPDATE geändert, sodass das Ereignis CLOSE zurückgegeben werden konnte. fileStream.openAsync (Datei, FileMode.UPDATE); Jetzt kann mein eventlistener abfeuern! fileStream.addEventListener (Ereignis.CLOSE, ??????); Und es funktioniert, wenn ich es auf finalScreen auf der größten Datei einstellen. Ich muss es jetzt so machen, nachdem die Datei geschlossen ist, geht es zum nächsten in Array. – mubhcaeb

Antwort

0

Ok Ich habe keine Möglichkeit gefunden, zwischen der Funktion, die im Array ausgeführt wird, zu "pausieren".

Stattdessen dachte ich über einen Zähler von Dateien, so dass es egal war, in welcher Reihenfolge sie geladen wurden, solange alle 11 geladen dann den Endzustand laden.

Hier ist mein Code für andere Referenz:

<fx:Script> 
    <![CDATA[ 
     private function close_window(event:MouseEvent):void 
     { 
      this.nativeApplication.exit(); 
     } 
     private function finalScreen():void 
     { 
      this.currentState="Finished"; 
     } 
     private function initiate_download(event:MouseEvent) 
     { 
      var filearray:Array = new Array(); 
      filearray[0]="0.jpg"; 
      filearray[1]="1.exe"; 
      filearray[2]="02.jpg"; 
      filearray[3]="2.exe"; 
      filearray[4]="04.jpg"; 
      filearray[5]="05.jpg"; 
      filearray[6]="4.exe"; 
      filearray[7]="07.jpg"; 
      filearray[8]="08.jpg"; 
      filearray[9]="09.jpg"; 
      filearray[10]="3.exe"; 
      for(var i:uint; i < filearray.length; i++) 
      { 
       var remoteURL = "http://domain/dir/" + filearray[i]; 
       var localURL = "C:/dir/" + filearray[i]; 
       downloadFile(remoteURL, localURL); 
      } 

      var filenumber = 0; 

      function downloadFile(url, filename) 
      { 
       // Create the stream for the data request 
       var urlStream = new URLStream(); 

       // Used to initiate request for remote file 
       var request = new URLRequest(url); 

       // Create file stream 
       var fileStream = new FileStream(); 

       // Create a reference to a location on disk 
       var file = File.desktopDirectory.resolvePath(filename); 

       // Called as download progresses 
       var writeFile = function() 
       { 
        // Write to file 
        if (urlStream.bytesAvailable > 51200) 
        { 
         var dataBuffer = new ByteArray(); 
         urlStream.readBytes(dataBuffer, 0, urlStream.bytesAvailable); 
         fileStream.writeBytes(dataBuffer, 0, dataBuffer.length); 
        } 
        return true; 
       } 

       // Called when download completes 
       var finishWriteFile = function() 
       { 
        // Write to file 
        if(urlStream.bytesAvailable > 0) 
        { 
         var dataBuffer = new ByteArray(); 
         urlStream.readBytes(dataBuffer, 0, urlStream.bytesAvailable); 
         fileStream.writeBytes(dataBuffer, 0, dataBuffer.length); 
        } 

        // Close streams 
        fileStream.close(); 
        urlStream.close(); 
        return true; 
       } 

       // Initiate download 
       fileStream.openAsync(file, FileMode.UPDATE); 
       urlStream.load(request); 

       // Add event listeners 
       urlStream.addEventListener(Event.COMPLETE, finishWriteFile); 
       urlStream.addEventListener(ProgressEvent.PROGRESS, writeFile); 
       fileStream.addEventListener(Event.CLOSE, updateProgress); 

       function updateProgress(event:Event):void 
       { 
        filenumber = filenumber+1; 
        progbar.setProgress(filenumber*10, 110); 
        if(10*filenumber == 110) 
        { 
         finalScreen(); 
        } 
       } 
      } 

     } 
    ]]> 
</fx:Script> 

<fx:Declarations> 
    <!-- Place non-visual elements (e.g., services, value objects) here --> 
</fx:Declarations> 

<s:states> 
    <s:State name="Start"/> 
    <s:State name="Working"/> 
    <s:State name="Finished"/> 
</s:states> 

<mx:Image x="0" y="0" source="background.jpg"/> 
<s:Button x="50" y="110" includeIn="Start" label="Update" id="download" click="currentState='Working'; initiate_download(event)" color="#FFFFFF" fontSize="30" width="300" height="40"/> 
<s:Button x="50" y="110" includeIn="Finished" label="Close Window" id="closer" click="close_window(event)" color="#FFFFFF" fontSize="30" width="300" height="40"/>  
<s:RichText includeIn="Start" x="-22" y="85" text="Press Update to begin." width="444" textAlign="center" fontSize="14" id="starttext" color="#FFFFFF"/> 
<s:RichText includeIn="Working" x="-22" y="85" text="Downloading and updating files...." width="444" textAlign="center" fontSize="14" id="workingtext" color="#848484"/> 
<s:RichText includeIn="Finished" x="109" y="85" text="Update completed." width="191" textAlign="center" fontSize="14" id="finishedtext" color="#49D30C"/> 
<mx:ProgressBar includeIn="Working" id="progbar" mode="manual" x="121" y="107" fontSize="18" textAlign="center"/>