0

このコードにより、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");
}
4

1 に答える 1

3

関数内で andを宣言するNetConectionNetStream、その変数のスコープがその関数に対してローカルになります。つまり、NetConnection作成した を他に参照していないため、ガベージ コレクターは次の実行時にそれをスイープします (そのため、可変時間が表示されます)。

if ステートメントだけで宣言すると、変数はムービーのスコープ内にあり、変数への参照を保持するため、ガベージ コレクションは行われません。

残りのコードのアーキテクチャがどのようなものかはわかりませんが、関数を使用してコードを保持する場合はvar nc:NetConnection = new NetConnection();、ステートメントの直前に 宣言を入れてみてloadSong();ください。

アーキテクチャ的には、フレームからコードをリファクタリングしたい場合がありますが、数行のコードしかない場合は、実際には価値がないかもしれません。プロジェクトによって異なります。

ガベージ コレクションの詳細については、Flash Player 9のガベージ コレクションについてをご覧ください (Flash Player 9 と書かれていますが、これは 10 にも当てはまります)。

于 2010-11-25T03:56:43.020 に答える