機能を使用するときの奇妙なネットストリームの問題
-
28-09-2019 - |
質問
このコードにより、F4Vファイルは時期尚早に再生を停止します。時間は変わりますが、約8〜10秒です。
loadSong();
function loadSong()
{
if(!songPlaying)
{
songPlaying = true;
var customClient:Object = new Object();
customClient.onCuePoint = cuePointHandler;
customClient.onMetaData = metaDataHandler;
var nc:NetConnection = new NetConnection();
nc.connect(null);
var ns:NetStream = new NetStream(nc);
ns.client = customClient;
ns.play("song.f4v");
}
trace("HERE");
}
function cuePointHandler(infoObject:Object):void{
trace(infoObject.name);
}
function metaDataHandler(infoObject:Object):void {
trace("metaData");
}
このコードは、F4Vが最後まで再生されます。 wtf!?関数を介してそれを呼ぶとき、それは問題を引き起こすようです。参考までに、コードはメインタイムラインの最初のフレームに保存され、F4Vはオーディオのみです。どんな助けも感謝します。
if(!songPlaying)
{
songPlaying = true;
var customClient:Object = new Object();
customClient.onCuePoint = cuePointHandler;
customClient.onMetaData = metaDataHandler;
var nc:NetConnection = new NetConnection();
nc.connect(null);
var ns:NetStream = new NetStream(nc);
ns.client = customClient;
ns.play("song.f4v");
}
解決
あなたがあなたを宣言するとき、何が起こっているのか NetConection
と NetStream
関数の内部は、その変数の範囲がその関数のローカルであることです。それは、他に何も参照していないことを意味します NetConnection
あなたが作成したので、ガベージコレクターは次の実行中にそれを一掃します(そのため、さまざまな時間が表示されています)。
IFステートメントでそれを宣言すると、変数は映画の範囲内にあり、それがそれらへの参照を保持しているため、ガベージは収集されません。
私はあなたのコードの残りの部分のアーキテクチャが何であるかわかりませんが、あなたがあなたのコードを保持して関数を使用する場合は、 var nc:NetConnection = new NetConnection();
直前に loadSong();
声明。
アーキテクチャには、コードをフレームからリファクタリングすることをお勧めしますが、コードのほんの数行であれば、それは本当に価値がないかもしれません。プロジェクトに依存するだけです。
ガベージコレクションの詳細については、ご覧ください フラッシュプレーヤーのごみ収集を理解9 (フラッシュプレーヤー9と書かれていますが、これも10に適用できます)。
所属していません StackOverflow