Странная проблема NetStream при использовании функции - PullRequest
0 голосов
/ 25 ноября 2010

Этот код вызывает преждевременное прекращение воспроизведения моего файла 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");
}

1 Ответ

3 голосов
/ 25 ноября 2010

Что происходит, когда вы объявляете свои NetConection и NetStream внутри функции, так это то, что область действия этой переменной является локальной для этой функции. Это означает, что ничто другое не ссылается на созданный вами NetConnection, и поэтому сборщик мусора подметает его во время следующего запуска (вот почему вы видите переменную времени).

Когда вы объявляете это просто в операторе if, переменные попадают в область действия фильма и содержат ссылку на них и, следовательно, не собирают мусор.

Я не знаю, какова архитектура для остальной части вашего кода, но если вы хотите использовать функции для хранения вашего кода, попробуйте поместить объявление для var nc:NetConnection = new NetConnection(); непосредственно перед оператором loadSong();.

Архитектурно, вы можете реорганизовать свой код вне фрейма, но на самом деле это может не стоить того, если это всего лишь пара строк кода. Просто зависит от вашего проекта.

Для получения дополнительной информации о сборке мусора, ознакомьтесь с Общие сведения о сборке мусора в Flash Player 9 (там сказано, Flash Player 9, но это применимо и к 10).

...