2016-04-13 7 views
0

私はfile.browseForOpenでファイルダイアログを開こうとしています。たいていの場合は動作しますが、非常にまれに(ミーティングなど)、ファイルブラウザは表示されず、ブロックされません(モーダルとして)。なぜ、browseForOpenがファイルダイアログを表示しても、呼び出されても開いていると主張するのはなぜですか?

この時点でコードを呼び出すボタンを押すと、「1つしかありません」というエラーが表示されます。

メインウィンドウを最小化した後でも、サブウィンドウがなく、ファイルダイアログを見つけることができませんが、エラーは開いていると主張します。上記のコードが呼び出されたときにボタンを無効にしてイベントのいずれかで有効にするコードを書きましたが、このエラーが発生するとボタンが永久に無効になります。

さらに10,000行のコードがありますが、ファイルブラウザが開いている間も実行されているコードもあります。それらのどれもファイルブラウザに関連しているようではないので、次のコードを新しいプロジェクトに移動してテストし、バグを複製できませんでした。

var filter:FileFilter = new FileFilter("Image/Video", "*.jpg;*.png;*.mp4;"); 
var imagesFilter:FileFilter = new FileFilter("jpg/png", "*.jpg;*.png"); 
var docFilter:FileFilter = new FileFilter("mp4", "*.mp4;"); 
var filters:Array = [filter, imagesFilter, docFilter]; 

var fileBrowser:File = File.userDirectory; 
fileBrowser.addEventListener(FileListEvent.SELECT_MULTIPLE, onFileSelected); 
fileBrowser.addEventListener(Event.CANCEL, clean); 
fileBrowser.addEventListener(IOErrorEvent.IO_ERROR, clean); 
fileBrowser.browseForOpen("Select Slides", filters); 

私は「乾草の針」からの徹底的な検索から私を救うことができるものは誰も知っていますか?誰もこの同じ問題を経験したことがありますか? 「ファイルダイアログが開いても表示されません」、または「ファイルダイアログが開かない」など30種類以上の検索を検索すると、解決策が見つかりませんでした。

最後に、ブロックする必要がある間にユーザーがメインウィンドウとやり取りしていることを検出すると、ファイルダイアログを強制的に閉じる方法はありますか?包帯の修復と同様に、問題は解決されません(モーダルフローを破る、私は知っていますが、モーダルフローはすでにその時点で壊れています)。

UPDATE:クラスを削除し、効率の低いurlMonitorの問題を、それを交換した後

がなくなっているようです。 誰かが何がうまくできなかった場合は、私はあなたの答えを完全なものとしてマークします。私は削除 クラスは完全に無関係に見えたが、私は、コードが表示されます:ラジャJaganathanに精通

package reuse.Network 
{ 
    import flash.desktop.NativeApplication; 
    import flash.events.Event; 
    import flash.events.EventDispatcher; 
    import flash.events.IOErrorEvent; 
    import flash.events.StatusEvent; 
    import flash.events.TimerEvent; 
    import flash.net.URLLoader; 
    import flash.net.URLLoaderDataFormat; 
    import flash.net.URLRequest; 
    import flash.utils.Timer; 

    import air.net.URLMonitor; 

    [Event(name="networkStatusChanged", type="reuse.Network.CheckInternetEvent")] 
    public class NetStatusMonitor extends EventDispatcher 
    { 
     private var url:String; 
     private var urlMonitor:URLMonitor; 

     public function NetStatusMonitor(url:String = 'http://www.adobe.com') 
     { 
      super(); 
      this.url = url; 
     } 

     protected function onNetwork_ChangeHandler(event:Event):void 
     { 
      checkWebsite(url, dispatchStatus); 
     } 

     /** 
     * Checks a specific website for connectivity. 
     * @param uri URI of the website to check for a response from 
     * @param result Function which accepts a bool as a response. 
     * @param idleTimeout How many milliseconds to wait before timing out 
     */ 
     public function checkWebsite(uri:String, result:Function, idleTimeout:Number = NaN):void 
     { 
      var timeout:Timer; 
      var request:URLRequest = new URLRequest(uri); 

      if(!isNaN(idleTimeout)) 
      { 
       request.idleTimeout = idleTimeout; 

       timeout = new Timer(request.idleTimeout + 1000, 1); 
       timeout.addEventListener(TimerEvent.TIMER_COMPLETE, failed); 
       timeout.start(); 
      } 

      var loader:URLLoader = new URLLoader(); 
      loader.dataFormat = URLLoaderDataFormat.TEXT; 
      loader.addEventListener(Event.COMPLETE, complete); 
      loader.addEventListener(IOErrorEvent.IO_ERROR, failed); 
      loader.load(request); 

      function complete():void 
      { 
       result(true); 
       cleanup(); 
      } 

      function failed(e:*):void 
      { 
       result(false); 
       cleanup(); 
      } 

      function cleanup():void 
      { 
       if(timeout) 
       { 
        timeout.stop(); 
        timeout.removeEventListener(TimerEvent.TIMER_COMPLETE, failed); 
        timeout = null; 
       } 

       loader.close(); 
       loader.removeEventListener(Event.COMPLETE, complete); 
       loader.removeEventListener(IOErrorEvent.IO_ERROR, failed); 
       loader = null; 
      } 
     } 

     public function start():void 
     { 
      checkWebsite(url, dispatchStatus, 5000); 

      if(!NativeApplication.nativeApplication.hasEventListener(Event.NETWORK_CHANGE)) 
       NativeApplication.nativeApplication.addEventListener(Event.NETWORK_CHANGE, onNetwork_ChangeHandler); 

      if(urlMonitor == null) 
      { 
       var request:URLRequest = new URLRequest(url); 
       urlMonitor = new URLMonitor(request); 
       urlMonitor.pollInterval = 30; 
      } 

      if(!urlMonitor.hasEventListener(StatusEvent.STATUS)) 
       urlMonitor.addEventListener(StatusEvent.STATUS, onNetStatus_ChangeHandler); 

      if(!urlMonitor.running) 
       urlMonitor.start(); 
     } 

     public function stop():void 
     { 
      if(urlMonitor) 
      { 
       if(urlMonitor.running) 
        urlMonitor.stop(); 

       if(urlMonitor.hasEventListener(StatusEvent.STATUS)) 
        urlMonitor.removeEventListener(StatusEvent.STATUS, onNetStatus_ChangeHandler); 

       urlMonitor = null; 
      } 
     } 

     private function onNetStatus_ChangeHandler(event:StatusEvent):void 
     { 
      dispatchStatus(urlMonitor.available); 
     } 

     private function dispatchStatus(status:Boolean):void 
     { 
      dispatchEvent(new CheckInternetEvent(CheckInternetEvent.NETWORK_STATUS_CHANGED, status)); 
     } 
    } 
} 

誰もがAdobe Air - Check for internet connection

答えて

0

からこのクラスを認識かもしれない私は、Adobeのバグとしてこれを掲示し、次の注意をしましたそれに追加:

アレックスRekish

11時06分11秒PM GMT + 00:00 2016年4月12日

私はこの問題を見て、回避策を見つけました。 リスナーを削除する必要があります。取り消しを強制するには、 browseForOpenメソッドを使用する必要があります。

previousBrowseFile.removeEventListener(Event.SELECT、 fileSelected); previousBrowseFile.removeEventListener(Event.CANCEL、 fileCancelled); previousBrowseFile.cancel(); previousBrowseFile = null;

関連する問題