Наблюдается из лениво инициализированного поля

У меня есть этот класс. Я бы хотел, чтобы клиент этого класса получал экземпляр поля 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? Заранее спасибо!


person beka    schedule 31.08.2016    source источник


Ответы (1)


Вы можете создать экземпляр 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 в качестве параметра не имеет значения.

person dwursteisen    schedule 31.08.2016
comment
Хороший человек! Спасибо. Я не хочу, чтобы он выделялся только раз. Я хочу использовать свежую версию chatHub var. По этой причине я могу удалить replay(1) из? - person beka; 01.09.2016
comment
просто верните subject. должно хватить (без autoconnect тоже) - person dwursteisen; 01.09.2016
comment
и вы можете также удалить subject.onCompleted() - person dwursteisen; 01.09.2016