如何在两个视图之间共享相同的NetConnection对象?

时间:2011-06-11 21:03:57

标签: flash flex actionscript-3 flash-media-server netconnection

Flex Mobile应用程序是基于视图的。我正在使用Adobe Cirrus(我假设它与任何FMS netConnection相同)有没有人知道如何在flex移动应用程序中维护视图之间的持久netConnection?

编辑:尝试更清楚地解释我需要的东西......

这里真的很简单我连接到卷云

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()

头脑风暴想法我在想我能做什么:

我以为我可以在主ViewNavigatorApplication mxml文件上设置连接,但是我已经有很多事情要继续并且基于netConnection状态事件被触发了,看起来处理来自mxml文件的所有内容可能真的很复杂每个观点。

也许我可以在ViewNavigatorApplication mxml文件中声明netCon变量,只是在每个视图上为这些变量添加事件监听器?

但我不熟悉访问mainViewNavigatorApplication mxml文件中存在的变量

我只需要能够建立一次连接,然后一直保持持久直到我致电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;

和我的主页视图中的相同

但是当我尝试拨打

时,我收到了一个空错误 在profileView上的crationComplete函数中的

trace(netConnection.nearID)(在homeView之后)查看它是否仍然具有相同的netConnection,然后应该能够获得相同的nearID

4 个答案:

答案 0 :(得分:2)

听起来你正在混淆View&的责任。服务。

看看一些框架来帮助你使用MVC方法 - 我建议Parsley(因为这是我所知道的),但我听说RobotLegs也很棒,并且可能更适合移动应用程序,

一般来说 - 视图不应该具有明确的服务知识 - 这些通常在其他地方声明(例如在使用Parsley或RobotLegs的Context中)。

您的观点的逻辑被封装在演示模型(PM)中。这在构建移动应用时尤为重要,因为相同的逻辑可能适用于您的视图的许多不同版本(即Android,iOS,平板电脑等)。

然后,您可以使用消息(事件)发送状态更新,并使用PM在您的应用程序中保持持久状态。

答案 1 :(得分:1)

如果您打算询问“我如何在多个视图之间共享相同的NetConnection”。

只需为每个视图提供对同一NetConnection对象的引用即可。每个视图都可以拥有自己的,从NetConnection对象调度的事件的不同侦听器。

它不必比在ProfileView和HomeView类中创建属性更复杂,如下所示:

public var netConnectionInstance : NetConnection;

你可以,确切地说,在两个类中都使用相同的行。

在包含两个视图的类中,执行以下操作:

var netConnectionInstance = new NetConnection()
profileView.netConnectionInstance  = netConnectionInstance;
homeView.netConnectionInstance  = netConnectionInstance;

我假设在这种情况下,profileView和homeView都是同一个类的子节点。如果你有一个更复杂的显示对象结构,事情可能会变得更复杂;但概念是一样的。

答案 2 :(得分:0)

您可以使用像Singleton这样的设计模式来维护视图之间的持久连接

答案 3 :(得分:0)

这是答案: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),它与之前的视图相同,所以它可以工作!

感谢您帮助我找到解决此Flexcoders的正确方向,您发布的解决方案更多是关于设置全局变量,此解决方案使用flex移动滥用导航器以我们猜测的方式传递对象。