Интересно, можно ли закончить вызов unsubscribe
из обработчика onNext
следующим образом:
List<Integer> gatheredItems = new ArrayList<>();
Subscriber<Integer> subscriber = new Subscriber<Integer>() {
public void onNext(Integer item) {
gatheredItems.add(item);
if (item == 3) {
unsubscribe();
}
}
public void onCompleted() {
// noop
}
public void onError(Throwable sourceError) {
// noop
}
};
Observable<Integer> source = Observable.range(0,100);
source.subscribe(subscriber);
sleep(1000);
System.out.println(gatheredItems);
Вышеуказанный код правильно выводит, что было собрано всего четыре элемента: [0, 1, 2, 3]
. Но если кто-то изменит источник, наблюдаемый для кэширования:
Observable<Integer> source = Observable.range(0,100).cache();
Затем собраны все сто элементов. У меня нет контроля над наблюдаемым источником (независимо от того, кэшируется он или нет), поэтому как определенно отказаться от подписки из onNext
?
Кстати: Так что отказаться от подписки в onNext
неправильно?
(Мой фактический прецедент заключается в том, что в onNext
я на самом деле записываю поток вывода, а когда IOException
происходит, ничего больше не может быть записано на выход, поэтому мне нужно как-то прекратить дальнейшую обработку.)