2016-08-31 2 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으로 구성됩니다.

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

관련 문제