Как я могу использовать один и тот же объект NetConnection между двумя представлениями? - PullRequest
1 голос
/ 12 июня 2011

Flex Mobile приложения основаны на просмотре. И я использую Adobe Cirrus (я предполагаю, что он одинаков для любого сетевого соединения FMS) Кто-нибудь знает, как поддерживать постоянное сетевое соединение между представлениями в гибком мобильном приложении?

изменить: попытаться объяснить, что мне нужно, более четко ...

Так просто здесь я подключаюсь к Cirrus

netConnection = new NetConnection();
netConnection.addEventListener(NetStatusEvent.NET_STATUS, cirrusStatusHandler);
netConnection.connect(CirrusAddress + "/" + DeveloperKey);

Тогда у меня есть это для запуска определенных функций в зависимости от состояния соединения,

protected function cirrusStatusHandler(event:NetStatusEvent):void

                switch (event.info.code)
                {
                    case "NetConnection.Connect.Closed" :
                        trace(event.info.code);
                        break;

                    case "NetConnection.Connect.Rejected" :
                        trace(event.info.code);
                        break;

                    case "NetConnection.Connect.Failed" :
                        trace(event.info.code);
                        break;

                    case "NetConnection.Connect.Success" :
                        trace(event.info.code);
                        break;

                    case "NetGroup.Connect.Success" :
                        trace(event.info.code);
                        break;

                    case "NetGroup.Posting.Notify" :
                        trace(event.info.code);
                        break;

                    case "NetGroup.Neighbor.Connect" :
                        trace(event.info.code);
                        break;

                    case "NetGroup.Neighbor.Disconnect" :
                        trace(event.info.code);
                        break;

                    case "NetGroup.SendTo.Notify" :
                        trace(event.info.code);
                        break;

                    case "NetStream.Connect.Success" :
                        trace(event.info.code);
                        break;

                    case "NetStream.Publish.Start" :
                        trace(event.info.code);

                        break;

                    case "NetStream.Play.Start" :
                        trace(event.info.code);
                        break;

                    case "NetStream.Play.Failed" :
                        trace(event.info.code);
                        break;


                    case "NetStream.Play.Stop" :
                        trace(event.info.code);
                        break;

                    case "NetStream.Connect.Closed" :
                        trace(event.info.code);
                        break;  

                    case "NetStream.Play.UnpublishNotify" :
                        trace(event.info.code);
                        break;  

                    case "NetStream.Unpublish.Success" :
                        trace(event.info.code);
                        break;

                }
            }

Я хочу иметь возможность trace(netConnection.nearID) в этом представлении, перейти в другое представление и trace(netConnection.nearID) и получить тот же результат. и быть в состоянии иметь функцию cirrusStatusHandler(), как у меня выше, для прослушивания перистых событий. Затем можно сделать netConnection.close() в другом представлении, если я хочу иметь возможность закрыть соединение.

Идеи для мозгового штурма, что я думал, что мог сделать:

Я думал, что мог бы установить соединение в основном mxml-файле ViewNavigatorApplication, но у меня так много работы и запуска на основе событий состояния netConnection, что, кажется, может быть действительно сложно обработать все из этого mxml-файла каждый из просмотров.

Может быть, я мог бы объявить переменные netCon в mxml-файле ViewNavigatorApplication и просто добавить прослушиватели событий для этих переменных в каждом представлении?

Но я не знаком с доступом к переменным, которые существуют в файле mxml mainViewNavigatorApplication

Мне просто нужно иметь возможность установить соединение один раз, а затем оно остается постоянным, пока я не позвоню netConnection.close()

Есть идеи? Это возможно? Просто? Действительно сложно?

Полагаю, я мог бы использовать отдельные представления, где мне не нужен netConnection, и просто использовать это конкретное представление, используя «состояния» внутри представления, где netCon должен быть постоянным. Просто кажется глупым использовать состояния, так как это приложение на основе представления.

РЕДАКТИРОВАТЬ: @ Flextras Ответ:

Обновлен:

Вот то, что я получил для компиляции без каких-либо ошибок (пока я не отлаживаю, я получаю объяснение сбоя)

Вот основной файл приложения ViewNavigatorApplication MYAPP.mxml Я положил это туда:

public static var netConnection:NetConnection;
public static var groupspec:GroupSpecifier; 
public static var netGroup:NetGroup;

views.HomeView.netConnection = netConnection;
views.ProfileView.netConnection = netConnection;
views.HomeView.groupspec = groupspec;
views.ProfileView.groupspec = groupspec;
views.HomeView.netGroup = netGroup;
views.ProfileView.netGroup = netGroup;

тогда в моем пакете представлений .. ProfileView.mxml:

public static var netConnection:NetConnection;
public static var groupspec:GroupSpecifier;
public static var netGroup:NetGroup;

и то же самое в моем домашнем представлении

но я получаю нулевую ошибку при попытке позвонить

trace(netConnection.nearID) в функции crationComplete в profileView (который находится после homeView), чтобы увидеть, имеет ли он тот же netConnection и затем должен иметь возможность получить тот же nearID

Ответы [ 4 ]

2 голосов
/ 12 июня 2011

Звучит так, будто вы смешиваете ответственность View & Services.

Взгляните на некоторые фреймворки, чтобы помочь вам с подходом MVC - я бы предложил Parsley (потому что это то, что я знаю),но я слышал, что RobotLegs также великолепен и, возможно, более подходит для мобильного приложения,

Вообще говоря - представления не должны иметь явного знания об услугах - они обычно объявляются в другом месте (как в контекстеиспользуя Parsley или RobotLegs.)

Логика для ваших представлений инкапсулируется в модель представления (PM).Это особенно важно при создании мобильных приложений, где одна и та же логика может применяться ко многим различным версиям вашего представления (например, Android, iOS, планшет и т. Д.).

Тогда вы можете использовать обмен сообщениями (События) для отправки обновлений статуса и использования PM для сохранения постоянного состояния в вашем приложении.

1 голос
/ 12 июня 2011

Если вы хотели спросить «Как я могу использовать один и тот же NetConnection между несколькими представлениями».

Просто дайте каждому представлению ссылку на один и тот же объект NetConnection.Каждое представление может иметь своих собственных слушателей событий, отправляемых из объекта NetConnection.

Это не должно быть более сложным, чем создание свойства в классах ProfileView и HomeView, например:*

public var netConnectionInstance : NetConnection;

Вы можете буквально поместить одну и ту же строку в оба класса.

В классе, который содержит оба представления, сделать что-то вроде этого:В этом случае я предполагаю, что и profileView, и homeView являются детьми одного и того же класса.Все может стать немного сложнее, если у вас более сложная структура экранных объектов;но концепция та же самая.

0 голосов
/ 12 июня 2011

ЭТО ОТВЕТ: stackoverflow не позволит мне отметить этот ответ в течение 2 дней. Я отмечу это как таковое тогда извините, что это оставлено открытым.

Хорошо, я всегда знал, что вы можете передавать объект данных при нажатии представлений, и я использовал его для базовой информации и прочего, но я не знал, что вы можете сделать что-то подобное с netConnection, я просто не сделал Не думаю, что это будет работать так. и с точки зрения производительности, я думаю, что это путь к мобильным приложениям, потому что вместо того, чтобы заставлять что-то запускаться все время, я просто передаю его через представления, и каждый предыдущий вид разрушается.

Вот все, что нужно. Вот он, который у меня уже был на моем первом видении:

public var netConnection:NetConnection;
public var groupspec:GroupSpecifier;
public var netGroup:NetGroup;

Затем я просто помещаю эти переменные в объект, и при нажатии на представление, как если бы вы передавали любые другие данные в представление:

    var goToNextView:Object=new Object();
    goToNextView.netConnection = netConnection;
    goToNextView.groupspec = groupspec;
    goToNextView.netGroup = netGroup;

    navigator.pushView(views.ProfileView,goToProfileObject);

затем при следующем просмотре получили данные от объекта следующим образом:

netConnection = data.netConnection;
groupspec= data.groupspec;
netGroup = data.netGroup;

затем я сделал трассировку (netConnection.nearID) для нового представления, и оно было таким же, как и для представления ранее, поэтому оно работает!

Спасибо за то, что вы выбрали меня в правильном направлении для решения этого гибкого кодера. Решение, которое вы разместили, было больше о настройке глобальных переменных, это решение использует гибкий мобильный навигатор абликации для передачи объектов так, как они предполагают отступ.

0 голосов
/ 12 июня 2011

Вы можете использовать шаблон проектирования, например Singleton, для поддержания постоянной связи между вашими представлениями

...