2016-06-11 4 views
0

異なるフラグメントやアクティビティにハブ接続を渡すことができるので、アプリケーション全体で同じ接続を使用できますか? は、例えば、プロキシ接続は、このような設定である:Xamarin SignalR - 異なるフラグメント/アクティビティで同じ接続プロキシを使用する

var chatHubProxy = hubConnection.CreateHubProxy("ChatHub"); 

私は別のフラグメント内のクライアント方法chatHubProxy.On<string, int, string>("UpdateChatMessage", (message, color, user)を使用します。サーバーメソッドを呼び出す場合と同じですが、別のフラグメント/アクティビティで同じプロキシを使用して呼び出すことはできますか?

答えて

1

これは簡単で、ハブを静的にします。あるいは、SingletonですべてのSignalRを処理して、ロジックを一箇所に集約してください。

これを行うには、そのシングルトン内のすべてのサーバーイベントにサブスクライブしてから、そのクラスをカスタムイベントに再ディスパッチさせます。

protected override void OnPause() 
{ 
    base.OnPause(); 
    // Don´t forget to unsubscribe 
    YourSingleton.Instance.OnAddNewMessage -= OnAddNewMessage; 
} 

protected override void OnResume() 
{ 
    base.OnResume(); 

    YourSingleton.Instance.OnAddNewMessage += OnAddNewMessage; 
} 

private void OnAddNewMessage(ChatMessage message) 
{ 
    // TODO 
} 
+0

グレート答え:

public event Action<string, User> OnShowMatchingInvite; public event Action<MatchingResolutions, Conversation> OnMatchingResolution; public event Action<string> OnPeerLeftConversation; public event Action<ChatMessage> OnAddNewMessage; public event Action<string, ChatMessageStatus> OnConfirmMessageDelivered; public event Action<string> OnConfirmMessageReceived; public event Action<string> OnConfirmMessageRead; public event Action<UserChatStatus> OnChangeUserChatStatus; public event Action<string> OnConversationKilled; private void ProxySubscriber(IHubProxy hubProxy) { hubProxy.On<string, User>(Settings.HubListenerShowMatchingInvite, (matchingUid, peer) => OnShowMatchingInvite?.Invoke(matchingUid, peer)); hubProxy.On<MatchingResolutions, Conversation>(Settings.HubListenerHandleMatchingResolution, (resolution, conversation) => OnMatchingResolution?.Invoke(resolution, conversation)); hubProxy.On<string>(Settings.HubListenerPeerLeftConversation, conversationId => OnPeerLeftConversation?.Invoke(conversationId)); hubProxy.On<ChatMessage>(Settings.HubListenerAddNewMessage, message => OnAddNewMessage?.Invoke(message)); hubProxy.On<string, ChatMessageStatus>(Settings.HubListenerConfirmMessageDelivered, (messageUid, status) => OnConfirmMessageDelivered?.Invoke(messageUid, status)); hubProxy.On<string>(Settings.HubListenerConfirmMessageReceived, uid => OnConfirmMessageReceived?.Invoke(uid)); hubProxy.On<string>(Settings.HubListenerConfirmMessageRead, uid => OnConfirmMessageRead?.Invoke(uid)); hubProxy.On<UserChatStatus>(Settings.HubListenerChangeUserChatStatus, status => OnChangeUserChatStatus?.Invoke(status)); hubProxy.On<string>(Settings.HubListenerHandleConversationKilled, conversationId => OnConversationKilled?.Invoke(conversationId)); } 

次に、あなたがあなたの活動/フラグメントから、それらのイベントに解除/サブスクライブすることができます:Here'sの例では、動作するアプリケーションを構成します!これは事実を視点に置きます。 –

+0

ただ1つの質問。この場合、 "YourSignleton"クラスはどこでインスタンス化されますか?それは断片/私がSignalR活動を持つ活動の中にあるのでしょうか?この場合、メソッド "ProxySubscriber"の引数としてhubProxyを指定する必要がありますか? –

+0

シングルトンは、あなたがSingletonclass.Instanceにアクセスするたびに、それ自体をインスタンス化するよく知られているパターンであり、アプリのライブサイクル全体で1回だけです。それを検索すると、さまざまな実装が見つかります。このアイデアは、あなたのアプリにただ一つの接続/ハブしか必要ないので、そのクラスのシグナル・コネクションとハブをすべて一緒に扱うことです。 – xleon

関連する問題