1

Flex Mobile アプリケーションはビュー ベースです。そして、私はAdobe Cirrusを使用しています(FMS netConnectionでも同じだと思います)フレックスモバイルアプリケーションのビュー間で永続的な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 vars を宣言し、各ビューのそれらの vars にイベント リスナーを追加するだけでよいでしょうか?

しかし、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;

私のホームビューでも同じです

しかし、電話しようとするとnullエラーが発生します

trace(netConnection.nearID)profileView (homeView の後) の crationComplete 関数で、まだ同じ netConnection があり、同じ NearID を取得できるかどうかを確認します。

4

4 に答える 4

2

ビューとサービスの責任を混在させているようです。

MVC アプローチに役立ついくつかのフレームワークを見てみましょう - 私は Parsley をお勧めしますが (私が知っているので)、RobotLegs も優れており、おそらくモバイル アプリケーションにより適していると聞いています。

一般的に言えば、ビューはサービスの明示的な知識を持つべきではありません。これらは通常、別の場所で宣言されます (Parsley を使用する Context や RobotLegs 内など)。

ビューのロジックは、プレゼンテーション モデル (PM) にカプセル化されます。これは、同じロジックが多くの異なるバージョンのビュー (つまり、Android、iOS、タブレットなど) に適用される可能性が高いモバイル アプリを構築する場合に特に重要です。

次に、ステータス更新を送信するためにメッセージング (イベント) を使用し、アプリケーション全体で永続的な状態を保持するために PM を使用できます。

于 2011-06-11T22:10:06.227 に答える
1

「複数のビュー間で同じ NetConnection を共有するにはどうすればよいですか」と尋ねたい場合。

各ビューに同じ NetConnection オブジェクトへの参照を与えるだけです。各ビューは、NetConnection オブジェクトからディスパッチされるイベントに対する独自の異なるリスナーを持つことができます。

次のように、ProfileView および HomeView クラスでプロパティを作成するよりも複雑である必要はありません。

public var netConnectionInstance : NetConnection;

文字通り、両方のクラスに同じ行を入れることができます。

両方のビューを含むクラスで、次のようにします。

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

この場合、profileView と homeView の両方が同じクラスの子であると想定しています。表示オブジェクトの構造がより複雑な場合は、状況が少し複雑になる可能性があります。しかし、コンセプトは同じです。

于 2011-06-11T23:34:06.797 に答える
0

これが答えです:stackoverflowでは、これを2日間答えとしてマークすることはできません。そのようにマークし、開いたままにして申し訳ありません。

わかりました。ビューをプッシュするときにデータ オブジェクトを渡すことができることは常に知っていました。基本的な情報などに使用してきましたが、netConnection でこのようなことができるとは知りませんでした。それはそのように機能します。パフォーマンスに関しては、これがモバイルアプリの場合の方法だと思います。ビューを介して渡すだけで何かを強制的に実行するのではなく、以前の各ビューが破棄されるためです。

これですべてです。私がすでにfirstViewに持っていた彼の変数は次のとおりです。

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;

次に、新しいビューで trace(netConnection.nearID) を実行しましたが、以前のビューと同じだったので、うまくいきました!

このフレックスコーダーを解決するために私を正しい方向に導いてくれてありがとう、あなたが投稿した解決策は、グローバル変数の設定に関するものでした.

于 2011-06-12T03:38:14.020 に答える
0

Singleton のようなデザイン パターンを使用して、ビュー間の永続的な接続を維持できます。

于 2011-06-11T22:11:00.097 に答える