2016-08-31 4 views
0

私はこのクラスを持っています。このクラスのクライアントは、chatHubがコールバックに割り当てられるとすぐに、フィールドchatHubのインスタンスを取得します。 connection.connected(() - > chatHub = connection.createHubProxy( "ChatHub")); chatHubがnullの可能性があります。 chatHubは、初期化されるとすぐに加入者にプッシュする必要があります。 アイデア?遅延初期化フィールドから観測可能

public class SignalRManager { 
    private HubProxy chatHub; 

    public SignalRManager() { 
     Platform.loadPlatformComponent(new AndroidPlatformComponent()); 

     HubConnection connection = new HubConnection("https://test.chatlasapp.com/signalr/hubs"); 
     connection.stateChanged((connectionState, connectionState2) -> Log.i("SignalR", connectionState.name() + "->" + connectionState2.name())); 
     connection.closed(() -> { 
      Log.i("SignalR", "Closed"); 
      chatHub = null; 
      connection.start(); 
     }); 
     //As soon as HubConnection connected this callback invokes. 
     connection.connected(() -> chatHub = connection.createHubProxy("ChatHub")); 

     connection.start(); 
    } 

    Observable<HubProxy> getHubProxy(){ 

    } 
} 

getHubProxyメソッドを正しく実装する方法がわかりましたか? ありがとうございます!

答えて

0

インスタンスがPublishSubjectと考えられたらすぐにchatHubインスタンスを発行できます。その後、getHubProxyはこのサブジェクトを返すだけです。さらにサブスクリプションのためにreplayの1で構成されます。

public class SignalRManager { 
    private HubProxy chatHub; 
    private PublishSubject<HubProxy> subject = PublishSubject.create(); 

    public SignalRManager() { 
      connection = ... // code removed for clarity 
      connection.connected(() -> { 
       chatHub = connection.createHubProxy("ChatHub") 
       subject.onNext(chatHub); 
       subject.onCompleted(); 
     }); 

     connection.start(); 
    } 

    Observable<HubProxy> getHubProxy(){ 
     return subject.replay(1).autoconnect(); 
    } 
} 

パラメータとしてhubProxyを保持することは、それ以上関連しないことに注意してください。

+0

偉大な男!ありがとうございました。私はそれが時間だけに放出されることを望んでいません。私はchatHub varの "新鮮な"バージョンを使用したい。このため、リプレイ(1)を削除することはできますか? – beka

+0

は単に 'subject'を返します。それだけで十分です( 'autoconnect'もありません) – dwursteisen

+0

あなたは' subject.onCompleted() 'も削除したいかもしれません – dwursteisen

関連する問題