2010-12-14 10 views
1

Flex 4.1에서 Flash Builder 4 사용하기. 배열에 지정된 파일을 다운로드하는 에어 앱이 있습니다. 파일이 디스크에 기록 된 후에 상태를 변경하려고합니다.배열 함수가 끝날 때까지 대기 :

파일 다운로드가 완료되기 전에 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 배열 루프를 제한하고는 "중복"함수를 호출 할 때 마지막 남은 : 여기

다른 사람들이 참조 내 코드입니다 결국 상태가 변경되지만 비동기 쓰기 때문에 제대로 작동하지 않습니다. openStream에서 openStream으로 fileStream을 변경하고 파일을 순차적으로 다운로드하려고 시도하지만 속도가 느려집니다. – mubhcaeb

+0

거의 완성되었습니다! 열린 모드를 UPDATE로 변경하여 CLOSE 이벤트를 반환 할 수 있습니다. fileStream.openAsync (file, FileMode.UPDATE); 이제 내 이벤트 수신기를 사용할 수 있습니다! fileStream.addEventListener (Event.CLOSE, ??????); 그리고 가장 큰 파일에서 finalScreen으로 설정하면 작동합니다. 이제 파일을 닫은 후에 배열로 다음 파일로 이동해야합니다. – mubhcaeb

답변

0

Ok 배열에서 실행되는 함수 사이에서 "일시 중지"하는 방법을 찾지 못했습니다.

대신에 파일 카운터를 사용하여 모든로드 된로드가 최종 상태로로드되는 한로드 순서가 중요하지 않다고 생각했습니다. 나는이 덤비는되었습니다

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

관련 문제