2016-09-06 4 views
1

Обычно я используюRX суб наблюдаемым - выполнить только один раз

Observable observable = someObservable.replay().refCount(); 

для создания наблюдаемого, который выполняется только один раз. Это прекрасно работает, если я подписаться на observable несколько раз, как следующее:

observable.observeOn(Schedulers.io()) 
    .subscribeOn(AndroidSchedulers.mainThread()) 
    .subscribe(...); 

observable.observeOn(Schedulers.io()) 
    .subscribeOn(AndroidSchedulers.mainThread()) 
    .subscribe(...); 

observable выполняется только один раз - совершенны, как я хочу. Если я теперь сделать следующее:

Observable obs1 = observable.map(...); // call some operators 
Observable obs2 = observable.map(...); // call some operators 

obs1.observeOn(Schedulers.io()) 
    .subscribeOn(AndroidSchedulers.mainThread()) 
    .subscribe(...); 

obs2.observeOn(Schedulers.io()) 
    .subscribeOn(AndroidSchedulers.mainThread()) 
    .subscribe(...); 

Затем observable выполняется дважды. Как я могу убедиться, что этого не произойдет?

ответ

2

Я думаю, что вы хотите добавить оператора .take(1). Таким образом, как только что-то прочитано из наблюдаемого, оно вызовет onComplete.

+0

Я хочу воспроизвести всю последовательность ... Я не хочу ничего потерять. Все n элементов, излучаемых моим наблюдаемым, должны испускаться любому абоненту или любой цепочке, наблюдаемый используется в – prom85

+1

ах. Я понимаю, вы можете использовать оператор .cache(). Таким образом, первое исполнение создаст наблюдаемое, в то время как любой другой абонент получит точно такие же кешированные выбросы. Подумайте о .cache как состоянии для вас. – FriendlyMikhail

+0

это работает. Я все еще смущен, почему 'refCount' не работает ... Кажется, что' refCount' работает только в том случае, если я подписываюсь на результат, наблюдаемый напрямую (я никогда не читал об этом пока что) ... Использование 'autoConnect' вместо этого работает также ... – prom85

Смежные вопросы