我正在使用PublishSubject
和map
运算符:
@Test
public void testMapWithMultipleObservers() {
PublishSubject<Integer> subject = PublishSubject.create();
Func1 action = spy(new Func1<Integer, Integer>() {
@Override
public Integer call(Integer integer) {
return integer;
}
});
Observable<Integer> observable = subject.asObservable().map(action);
observable.subscribe(mock(Observer.class));
observable.subscribe(mock(Observer.class));
subject.onNext(1);
verify(action, times(2)).call(anyInt());
// however, I need it to be times(1)
}
所需的行为是在主题产生值后执行操作。我已经尝试了doOnEach
,doOnNext
,map
,并且在每种情况下都会为每个当前观察者执行操作(对于100个观察者,操作将执行100次),而我需要它按发射执行。
你能提出什么建议吗?
感谢。
答案 0 :(得分:1)
最快的选择是使用share()
Observable<Integer> observable =
subject
.map(action)
.share();
您不需要asObservable()调用。它用于从API返回主题并阻止调用者将其强制转换回主题。例如:
Observable<Integer> getSubjectAsObservable() {
return subject.asObservable();
}