从惰性初始化字段可观察到

时间:2016-08-31 20:35:52

标签: rx-java observable lazy-initialization reactivex

我有这门课。我想,只要在​​回调中分配 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方法? 提前谢谢!

1 个答案:

答案 0 :(得分:0)

您可以尽快发出chatHub个实例,并考虑PublishSubject。然后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作为参数并不是更相关。