Правильное объяснение Observable в rxjava и rxandroid - PullRequest
0 голосов
/ 27 апреля 2018

Каковы правильные концепции и работы observables и наблюдателей в RxJava. Я запутался в словах буквального значения. Всякий раз, когда я изменяю значения observables, его соответствующие наблюдатели не вызываются, т. Е. Я объясню эту ситуацию немного глубже, сначала, когда я назначу observable со списком строк (List list) и подпишу его на наблюдателя. , наблюдатель работает отлично, но после этого, когда я изменяю значения списка (например, добавляю больше значений String в список) ... наблюдатель должен автоматически вызываться в следующем порядке, но это не так. Пытаюсь реализовать в Android изначально . Я буду рад за помощь.

1 Ответ

0 голосов
/ 27 апреля 2018

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.

...