2016-08-31 4 views
0

Ich habe diese Klasse. Ich möchte, dass der Client dieser Klasse die Instanz des Feldes chatHub erhält, sobald chatHub im Rückruf zugewiesen wurde connection.connected (() -> chatHub = connection.createHubProxy ("ChatHub")); chatHub könnte null sein. Wir müssen chatHub über den Abonnenten pushen, sobald es initialisiert wurde; irgendwelche Ideen?Observable von faul initialisiert Feld

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

    } 
} 

Ich frage mich, wie man getHubProxy Methode richtig implementieren? Vielen Dank im Voraus!

Antwort

0

Sie können chatHub Instanz ausgeben, sobald es inialized gedacht ist ein PublishSubject. Dann geben Sie einfach getHubProxy dieses Thema zurück, das mit einem replay von einem für ein weiteres Abonnement konfiguriert wird.

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

Bitte beachten Sie, dass es wichtiger ist, hubProxy als Parameter zu behalten.

+0

Großer Mann! Vielen Dank. Ich will nicht, dass es nur Zeit ausgestrahlt wird. Ich möchte "frische" Version von ChatHub var verwenden. Kann ich aus diesem Grund Replay (1) entfernen? – beka

+0

gib einfach 'subject' zurück. es sollte genug sein (ohne 'autoconnect' auch) – dwursteisen

+0

und Sie können' subject.onCompleted() 'auch entfernen – dwursteisen