2つのビュー間で同じNetConnectionオブジェクトを共有するにはどうすればよいですか?
-
26-10-2019 - |
質問
フレックスモバイルアプリケーションはビューベースです。そして、私はAdobe Cirrusを使用しています(FMS NetConnectionで同じと仮定しています)Flex Mobileアプリケーションのビュー間の永続的なネット接続を維持する方法を知っていますか?
編集:もっと明確に必要なものを説明しようとする...
ここでとてもシンプルなので、私は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()
私が上記のように機能して、Cirrusイベントを聞く。その後、できるようになります netConnection.close()
接続を閉じることができるようにしたい場合は、別のビューで。
ブレインストーミングアイデア私ができると思っていたこと:
Main ViewNavigatorApplication MXMLファイルに接続を設定できると思っていましたが、NetConnectionステータスイベントに基づいて多くのことをトリガーしています。ビュー。
ViewNavigatorApplication MXMLファイルでNetCon VARを宣言し、各ビューでそれらのVARにイベントリスナーを追加するだけかもしれませんか?
しかし、私はmainviewnavigatorApplication mxmlファイルに存在するVARSにアクセスすることに精通していません
私は一度接続を作ることができる必要があります、そして、それは私が電話するまで持続し続けます netConnection.close()
何か案は?これは可能ですか?単純?本当に複雑ですか?
NetConnectionを必要としない別々のビューを使用して、この特定のビューに、ネットコンが永続的である必要があるビュー内で「状態」を使用することができると思います。これはビューベースのアプリケーションであるため、状態を使用することはばかげているようです。
編集: @ 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;
それから私のビューでパッケージで..プロフィールview.mxml:
public static var netConnection:NetConnection;
public static var groupspec:GroupSpecifier;
public static var netGroup:NetGroup;
そして、私のホームビューでも同じです
しかし、私が電話しようとするとき、私はヌルのエラーを受けています
trace(netConnection.nearID)
ProfileViewのCrationComplete関数(ホームビューの後)では、同じNetConnectionがまだあるかどうかを確認します。
解決 4
これは答えです:StackOverFlowは、これを2日間の答えとマークすることができません。私はそれをマークし、それが開いたままにしていて申し訳ありません。
さて、私はあなたがビューをプッシュするときにデータオブジェクトを渡すことができることを常に知っていました、そして、私はそれを基本的な情報や物事に使用していましたが、私はあなたがネットコネクションでこのようなことができるとは知りませんでした、私はちょうど私は考えませんでしたそれはそのように機能します。そして、パフォーマンスの面では、これがモバイルアプリに行く方法だと思います。なぜなら、ビューを通してそれを渡すだけで、それぞれの前のビューが破壊されている間ずっと何かを実行するのではなく、それを実行するのではないかと思います。
これがすべてかかったことです。彼女は私がすでに私のFirstViewで持っていたVarsをVars:
public var netConnection:NetConnection;
public var groupspec:GroupSpecifier;
public var netGroup:NetGroup;
次に、これらのVARをオブジェクトに入れて、他のデータをビューに渡すのと同じようにビューを押すと:
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;
それから、新しいビューでTrace(netConnection.nearid)を実行しましたが、それは以前のビューと同じだったので、動作します!
このFlexCodersを解決するための正しい方向に進んでくれてありがとう、あなたが投稿したソリューションはグローバルなVARSのセットアップに関するものでした。このソリューションは、Flex Mobile Ablication Navigatorを使用して、インデントの方法でオブジェクトを渡すことです。
他のヒント
ビューとサービスの責任を混ぜ合わせているようです。
MVCアプローチを支援するためにいくつかのフレームワークを見てください - 私はパセリーを提案することをお勧めします(それは私が知っていることだからです)が、ロボットレッグも素晴らしく、モバイルアプリケーションに適していると聞いています。
一般的に言えば、ビューにはサービスに関する明示的な知識があるはずです - これらは一般に他の場所で宣言されています(ParsleyまたはRobotlegsを使用しているコンテキストのように)。
ビューのロジックは、プレゼンテーションモデル(PM)にカプセル化されます。これは、同じロジックが多くの異なるバージョンのビュー(つまり、Android、iOS、タブレットなど)に適用される可能性が高いモバイルアプリを構築する場合に特に重要です。
次に、ステータスの更新を送信するためにメッセージング(イベント)を使用し、PMを使用してアプリケーション全体で永続的な状態を保持することができます。
「複数のビュー間で同じネットコネクションを共有するにはどうすればよいか」と尋ねるつもりなら。
各ビューに同じNetConnectionオブジェクトへの参照を与えるだけです。各ビューには、NetConnectionオブジェクトから派遣されたイベントのリスナーが異なることができます。
このようなプロフィールビューやホームビュークラスにプロパティを作成するよりも複雑である必要はありません。
public var netConnectionInstance : NetConnection;
文字通り、両方のクラスで同じ行を置くことができます。
両方のビューを含むクラスでは、次のようなことをします。
var netConnectionInstance = new NetConnection()
profileView.netConnectionInstance = netConnectionInstance;
homeView.netConnectionInstance = netConnectionInstance;
この場合、ProfileViewとHomeViewの両方が同じクラスの子供であると仮定しています。より複雑なディスプレイオブジェクト構造がある場合、物事はもう少し複雑になる可能性があります。しかし、概念は同じです。
シングルトンのようなデザインパターンを使用して、ビュー間の永続的な接続を維持できます