Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   SharedObject и обработка событий NetStatusEvent (http://www.flasher.ru/forum/showthread.php?t=131709)

Мечтатель 26.10.2009 19:50

SharedObject и обработка событий NetStatusEvent
 
Столкнулся со следующей проблемой:
нужно записать данные на диск пользователя, делаю это с помощью метода flush(), затем проеряю константы, возвращаемые методом, создаю обработчик исключения, а также, если в настройках FlashPlayer'а у пользователя прописан меньший объем байт для хранения данных, регистрирую приемник событий для NetStatusEvent. Отслеживаю информацию из свойства code, событийного объекта info, для того, чтобы проверить разрешил ли пользователь увеличить объем для хранения информации.
А проблема заключается в том, что диспетчеризация события NetStatusEvent.NET_STATUS, по непонятной мне причине не происходит!
Вот код:

Код AS3:

package
{
        import flash.display.*;
        import flash.net.*;
        import flash.events.*;
 
 
        public class SharedExample extends Sprite
        {
 
 
                public function SharedExample()
                {
                        super();
                        var sharedObject:SharedObject=SharedObject.getLocal("SomeObject");
                        sharedObject.data.string="Property string has some value";
                        try
                        {
                                var writeResult:String=sharedObject.flush(10000);
                                if(writeResult==SharedObjectFlushStatus.PENDING)
                                {
                                        trace("PENDING");
                                        sharedObject.addEventListener(NetStatusEvent.NET_STATUS, netStatusListener);
                                }
                                else if(writeResult==SharedObjectFlushStatus.FLUSHED)
                                {
                                        trace("FLUSHED");
                                }
                        }
                        catch(error:Error)
                        {
                                trace("ERROR");
                        }
                }
 
                private function netStatusListener(e:NetStatusEvent):void
                {
                        if(e.info.code=="SharedObject.Flush.Success")
                        {
                                trace("SUCCESS");
                        }
                        else if(e.info.code=="SharedObject.Flush.Failed")
                        {
                                trace("FAILED");
                        }
                }
        }
}

Тестировал его в средах FlashPlayer (последняя версия и в качестве плагина для браузера и standalone) не работает!
В ходе эксперимента, также заметил интересную особенность, а именно:

Код AS3:

var sharedObject:SharedObject=SharedObject.getLocal("SomeObject");
sharedObject.data.string="Property string has some value";
try
{
        var writeResult:String=sharedObject.flush(10000);
        if (writeResult==SharedObjectFlushStatus.PENDING)
        {
                trace("PENDING");
                sharedObject.addEventListener(NetStatusEvent.NET_STATUS, netStatusListener);
        }
        else if (writeResult==SharedObjectFlushStatus.FLUSHED)
        {
                trace("FLUSHED");
        }
}
catch (error:Error)
{
        trace("ERROR");
}
 
 
function netStatusListener(e:NetStatusEvent):void
{
        if (e.info.code=="SharedObject.Flush.Success")
        {
                trace("SUCCESS");
        }
        else if (e.info.code=="SharedObject.Flush.Failed")
        {
                trace("FAILED");
        }
}

в этом случае диспетчеризация NetStatus происходит.
Смотрим пример ниже, чуток модифицирован

Код AS3:

createShared();
 
function createShared():void
{
var sharedObject:SharedObject=SharedObject.getLocal("SomeObject");
sharedObject.data.string="Property string has some value";
try
{
        var writeResult:String=sharedObject.flush(10000);
        if (writeResult==SharedObjectFlushStatus.PENDING)
        {
                trace("PENDING");
                sharedObject.addEventListener(NetStatusEvent.NET_STATUS, netStatusListener);
        }
        else if (writeResult==SharedObjectFlushStatus.FLUSHED)
        {
                trace("FLUSHED");
        }
}
catch (error:Error)
{
        trace("ERROR");
}
}
 
 
function netStatusListener(e:NetStatusEvent):void
{
        if (e.info.code=="SharedObject.Flush.Success")
        {
                trace("SUCCESS");
        }
        else if (e.info.code=="SharedObject.Flush.Failed")
        {
                trace("FAILED");
        }
}

а когда sharedObject создается в теле метода диспетчеризации не происходит.:umnik2:

Какие будут мысли по существу приведенных выше доводов? Буду весьма благодарен за дельные и конструктивные советы.

Добавлено через 52 минуты
Вопрос снимается. Видимо, после выполнения метода в котором объявляется sharedObject ссылка на него из программы удаляется, и деактивируется зарегистрированный приемник для событий NetStatusEvent, проблем нет, когда ссылка на SharedObject хранится в переменной экземпляра класса.


Часовой пояс GMT +4, время: 15:36.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.