В этом примере метод возвращает Observable<Integer>
чисел от 1 до 9:Observable.create (SyncOnSubscribe.createStateless (...)) бросает IllegalStateException: «onNext вызывается несколько раз!»
public class Provider {
public static Observable<Integer> test() {
return Observable.create(SyncOnSubscribe.createStateless(new Action1<Observer<? super Integer>>() {
@Override
public void call(Observer<? super Integer> observer) {
for (int i = 1; i < 9; i++)
// when i == 2, throws IllegalStateException:
// "onNext called multiple times!":
observer.onNext(i);
}
}));
}
}
Это один фильтр только 1 до 9 числа, кратные 3:
public class RxJavaUnitTest {
@Test
public void rxJavaTest(){
List<Integer> multiplesOf3 = Provider.test().filter(new Func1<Integer, Boolean>() {
@Override
public Boolean call(Integer i) {
return i % 3 == 0;
}
}).toList().toBlocking().single();
}
}
Но он бросает IllegalStateException: “onNext called multiple times!”
. Как я могу предоставить больше значений для observer
, если я не могу позвонить onNext
более одного раза?
Возможно, SyncOnSubscribe.createStateless
является неправильным методом здесь и заменен на что-то еще?
Хорошо, получилось. Однако я упростил свой вопрос ... Мне нужно решение для вложенных циклов 'for-each', например:' for (NetworkInterface intf: interfaces) Список addrs = Collections.list (intf.getInetAddresses()); for (InetAddress addr: addrs) {... observer.onNext (addr); ...} 'То, что я в основном пытаюсь сделать здесь, - это преобразовать метод getIPAddress из [этого ответа] (http://stackoverflow.com/questions/6064510/how-to-get-ip-address- of-the-device/13007325 # 13007325) на 'RxJava': мне нужна часть инициализатора. Итак, как я могу справиться с этим делом? –
Tar
@Tar Почему бы не использовать ['flatMapIterable'] (http://reactivex.io/RxJava/javadoc/rx/Observable.html#flatMapIterable (rx.functions.Func1))? Что-то вроде (псевдокод) 'Observable.from (интерфейсы) .flatMapIterable (intf :: getInetAddresses())' – Brice