Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 14.02.2011, 18:04
Vreden вне форума Посмотреть профиль Отправить личное сообщение для Vreden Найти все сообщения от Vreden
  № 1  
Ответить с цитированием
Vreden
 
Аватар для Vreden

Регистрация: Feb 2009
Сообщений: 141
По умолчанию NetConnection при ошибке сервера ликует

Код AS3:
private var __server:NetConnection = new NetConnection();
private var __responder:Responder;
 
public static const SERVER_ANSVER:String = "SERVER_ANSVER";
public static const ERROR:String = "ERROR";
 
public function AMFPHPServer()
{
__server.addEventListener(NetStatusEvent.NET_STATUS, errorHandler);
__server.addEventListener(AsyncErrorEvent.ASYNC_ERROR, errorHandler);
__server.addEventListener(IOErrorEvent.IO_ERROR, errorHandler);
__server.addEventListener(SecurityErrorEvent.SECURITY_ERROR, errorHandler);
}
 
public function call(service:String, parametr:*=null):void
{
__responder = new Responder(onResult);
__server.connect(GlobalVars.URL_PREFIX+GlobalVars.URL_SERVER);
__server.call(service, __responder, parametr);
}
 
private function onResult(value:*=null):void
{
__server.removeEventListener(NetStatusEvent.NET_STATUS, errorHandler);
__server.removeEventListener(AsyncErrorEvent.ASYNC_ERROR, errorHandler);
__server.removeEventListener(IOErrorEvent.IO_ERROR, errorHandler);
__server.removeEventListener(SecurityErrorEvent.SECURITY_ERROR, errorHandler);
 
this.dispatchEvent(new AMFPHPEvent(SERVER_ANSVER, value));
__server.close();
__server = null;
}
 
private function errorHandler(e:Object):void 
{
__server.removeEventListener(NetStatusEvent.NET_STATUS, errorHandler);
__server.removeEventListener(AsyncErrorEvent.ASYNC_ERROR, errorHandler);
__server.removeEventListener(IOErrorEvent.IO_ERROR, errorHandler);
__server.removeEventListener(SecurityErrorEvent.SECURITY_ERROR, errorHandler);	
__server.close();
__server = null;
}
Собственно, если сервер отработал без ошибок, то все отлично, класс не дает ликов памяти, все супер. Но вот если на сервере произошла ошибка и он не отвечает или отвечает не тем, чем нужно, то срабатывает функция errorHandler. И весь класс остается висеть в памяти пожизненно. Задача: необходимо избавиться от этого лика.

P.S Подозреваю, что лик образовывается из-за не отработанного Responder, который и ликует весь класс. Если в респондер добавить вторую функцию, которая в теории выполняется при ошибке сервера, то ничего не меняется, вторая функция вобще не срабатывает.

У кого-нибудь есть идеи?

Добавлено через 28 часов 52 минуты
Ну неужели никто никогда не использовал NetConnection?

Добавлено через 70 часов 24 минуты
Ау-у!

Старый 18.02.2011, 10:32
terbooter вне форума Посмотреть профиль Отправить личное сообщение для terbooter Найти все сообщения от terbooter
  № 2  
Ответить с цитированием
terbooter

Регистрация: Oct 2006
Адрес: Novosibirsk-Kaliningrad
Сообщений: 1,278
Отправить сообщение для terbooter с помощью ICQ Отправить сообщение для terbooter с помощью Skype™
А если делать вызов без респондера?
Подвисает в памяти объект __server ?

Старый 27.08.2011, 03:10
Vreden вне форума Посмотреть профиль Отправить личное сообщение для Vreden Найти все сообщения от Vreden
  № 3  
Ответить с цитированием
Vreden
 
Аватар для Vreden

Регистрация: Feb 2009
Сообщений: 141
Цитата:
Сообщение от terbooter Посмотреть сообщение
А если делать вызов без респондера?
Подвисает в памяти объект __server ?
Забыл я чего-то про эту темку...

В памяти подвисают экземпляры этого класса.
Если без респондера, то как отписываться от событий?

Решил вопрос способом, который мне не очень нравится, но работает.
Перед звонком на сервер, по таймауту вызываю функцию, которая отписывается от события, которое ждет ответа сервера и далее уже либо звоним еще раз, либо выдаем сообщение, что сервер не отвечает, если же сервер благополучно ответил очищаем установленный таймут.

Хоть и убил двух зайцев: нет ликов и есть обработка ошибок/недоступности сервера, мне не нравится подход тем, что нельзя избавиться от лика, без обработки ошибки/недоступности сервера. Вот, т.е хотелось бы, чтобы эту функцию брал не себя не способный ни на что в данном случае подлец респондер, а не писать к нему заплатки.

Добавлено через 11 минут
Только что осенило, что малость протупил:

Диспатчим наверх событие об ошибке сервера, либо по таймауту, либо по сработавшей errorHandler, а наверху подписавшись на это событие отписываемся от всего, чего нужно. Тогда не придется обрабатывать ошибку/недоступность в каждом случае таймаутом при работе с экземпляром, т.к. это будет внутри класса и таким образом наверху я так же смогу отписаться от события ожидающего ответа сервера и ликов это вызывать не будет. Ведь именно из-за этого события экземпляр оставался в памяти.

А респондер получается отрабатывает как нужно, если ошибка на сервере. Но вот если он вобще не отвечает... юзать таймаут внутри.

Сколько воды утекло, до сих пор юзаю этот класс с кривыми заплатками, а только сейчас осенило этой, удивляющей своей простотой, мыслью.

Создать новую тему Ответ Часовой пояс GMT +4, время: 05:26.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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