2010-12-14 2 views
1

Использование Flash Builder 4 с функцией flex 4.1. У меня есть приложение, которое загружает файлы, указанные в массиве. Я пытаюсь изменить состояние после того, как файлы были записаны на диск.Ожидание до завершения функции массива:

Функция finalscreen вызывается перед окончанием загрузки файлов. Это видно из большого видеофайла, который я тестировал.

<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> 

Спасибо!

+0

Хорошо, я баловаться с этим и ограничивается цикл массива к первому 11 и оставил последний называть «дублировать» функцию который имеет изменение состояния в конце, но из-за асинхронного написания это не работает. Я изменил файлStream из openasync, чтобы просто открыть его, и попытаюсь сделать файлы последовательно загруженными, но это замедлит работу. – mubhcaeb

+0

Почти получил это! Изменен режим открытого доступа к UPDATE, чтобы он мог вернуть событие CLOSE. fileStream.openAsync (файл, FileMode.UPDATE); Теперь мой исполнитель событий может сработать! fileStream.addEventListener (событие.CLOSE, ??????); И он работает, если я установил его в finalScreen на самый большой файл. Мне нужно сделать так, чтобы после закрытия файла он перешел к следующему массиву. – mubhcaeb

ответ

0

Хорошо, я не нашел способ «приостановить» между выполняемой функцией в массиве.

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

Вот мой код для других ссылки:

<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"/> 

Смежные вопросы