Observables
работа с тремя методами из Observer
: onNext
, onError
и onCompleted
. Когда вы делаете Observable
из списка и подписываетесь на него, Observable выдаст эти значения с помощью метода onNext
, а когда он закончится, он вызовет onCompleted
метод.
Вы не можете изменить значения, которые излучает Observable, изменив список, который вы дали некоторому оператору Observable. Какое бы у вас было желаемое поведение. Должен ли Observable
испускать все элементы при изменении списка или только новые изменения.
Эта наблюдаемая будет генерировать все изменения в коллекции, сделанные методом setCollection
:
public class CollectionObservable<T> extends Observable<T> {
private Collection<T> collection;
private List<Observer<? super T>> observers;
public CollectionObservable(Collection<T> collection) {
if (collection != null) {
this.collection = collection;
}
this.observers = new ArrayList<>(2);
}
public Collection<T> getCollection() {
return collection;
}
public void setCollection(Collection<T> collection) {
this.collection = collection;
emitValuesToAllObserver();
}
public void complete() {
if (this.collection != null) {
for (Observer<? super T> observer : this.observers) {
observer.onComplete();
}
}
}
@Override
protected void subscribeActual(Observer<? super T> observer) {
this.observers.add(observer);
emitValues(observer);
}
private void emitValuesToAllObserver() {
for (Observer<? super T> observer : this.observers) {
emitValues(observer);
}
}
private void emitValues(Observer<? super T> observer) {
if (this.collection != null) {
for (T obj : this.collection) {
observer.onNext(obj);
}
}
}
}
Обратите внимание, что для завершения вам нужно вручную вызвать метод complete
.