rxjava和rxandroid中可观察到的正确解释

时间:2018-04-27 11:58:41

标签: android observable rx-java2 rx-android

observablesRxJava和观察员的正确概念和工作是什么?我对字面意思这个词感到困惑。每当我更改observables的值时,其相应的观察者都没有被调用,即我将更深入地解释这种情况,最初当我为observable分配一个字符串列表(列表列表)和订阅时对于观察者来说,观察者工作得很好,但在那之后,当我更改list的值时(例如,将更多的String值添加到列表中)...下一个观察者应该自动被调用...但它不是#39;吨。尝试在 Android原生中实施。我会很乐意为你提供一些帮助。

1 个答案:

答案 0 :(得分:1)

Observables使用Observer中的三种方法:onNextonErroronCompleted。当您从列表中创建Observable并且您订阅它时,Observable将使用onNext方法发出这些值,当它完成时,它将调用onCompleted方法。

您无法通过更改为某些Observable运算符指定的列表来更改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方法。