0

いくつかの大きなバイナリ ファイルをダウンロードしてディスクに保存するアプリケーションがあります。一部のマシンでは正常に動作し、他のマシンでは時々ダウンロードが 99.9% 完了し、URLStream オブジェクトは Event.COMPLETE を起動しません。

これは、ここに表示される問題とほぼ同じです。

ファイルの読み込みが完了していないときに URLStream の完了イベントが送出されるのはなぜですか?

回答の1つで説明されている「キャッシュバスト」メソッドを使用してみましたが、まだサイコロはありません。

どんな助けでも大歓迎です。

私がやろうとしていることを説明するのに役立つサンプルコードを次に示します。

var contentURL:String = "http://some-large-binary-file-in-amazon-s3.tar";

var stream:URLStream = new URLStream();
stream.addEventListener(Event.COMPLETE, function(e:Event):void{
    //This should fire when the file is done downloading
    //On some systems this fails to fire once in a while
    //On other systems it never fails to fire               
});
stream.addEventListener(ProgressEvent.PROGRESS, function(pe:ProgressEvent):void{
    //Write the bytes available in the stream and save them to disk
   //Note that a download will reach 100% complete in terms of total progress but the 'complete' event might still not fire.
});

var urlRequest:URLRequest = new URLRequest(contentURL);
//Here we might add some headers to the URL Request for resuming a file
//but they don't matter, the 'Event.COMPLETE' will fail to fire with our without
//these headers
addCustomHeaders( urlRequest );

stream.load( urlRequest );
4

1 に答える 1

0

Imo これは、何が起こっているのかを意図的に制御することを放棄し、すべてが自動的に機能し、うまくいくと想定して失敗することを意図したコードです。URLStream クラスでまったく問題が発生したことはありませんが、基本的に私が決してしないことは次のとおりです。

  1. 利用可能なさまざまなエラーイベントをすべて登録するわけではありません(何も登録しません)。

  2. 私は匿名リスナーを決して使用しません。ダウンロードが完了するまでは GC ではないはずですが、これは不必要で安全でない賭けです。特に、最後のビットをロードしている間に URLStream が少しアイドル状態になることは珍しくありません。これらの匿名リスナーを削除することで実際に問題が解決したとしても、私は驚かないでしょう。

于 2016-04-15T13:50:32.823 に答える