如何在RxJava中的动态列表上创建Observer?

jua*_*ara 20 rx-java

我需要在一个不断变化的数组上创建一个Observer(添加元素).

我正在使用Obserable.from(Iterable),但它似乎在创建时创建了ArrayList上的Observable.

每次ArrayList获取添加的新元素时,我都需要通知Observer并执行Action.

jua*_*ara 38

你去吧 感谢RxJava Google Group上的DávidKarnok

import java.util.ArrayList;
import java.util.List;

import rx.Observable;
import rx.subjects.PublishSubject;

public class ObservableListExample {

    public static class ObservableList<T> {

        protected final List<T> list;
        protected final PublishSubject<T> onAdd;

        public ObservableList() {
            this.list = new ArrayList<T>();
            this.onAdd = PublishSubject.create();
        }
        public void add(T value) {
            list.add(value);
            onAdd.onNext(value);
        }
        public Observable<T> getObservable() {
            return onAdd;
        }
    }

    public static void main(String[] args) throws Exception {
        ObservableList<Integer> olist = new ObservableList<>();

        olist.getObservable().subscribe(System.out::println);

        olist.add(1);
        Thread.sleep(1000);
        olist.add(2);
        Thread.sleep(1000);
        olist.add(3);
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 不,先生.还没.我会这样做,让你知道:) (2认同)

GaR*_*eTa 5

我会考虑这种基于 BehaviourSubject 的方法。这与 juanpavergara 的解决方案不同,当订阅 Observable 时, onNext() 将立即发送给观察者。

public class ObservableList<T> {

    protected final List<T> list;
    protected final BehaviorSubject<List<T>> behaviorSubject;

    public ObservableList(List<T> list) {
        this.list = list;
        this.behaviorSubject = BehaviorSubject.create(list);
    }

    public Observable<List<T>> getObservable() {
        return behaviorSubject;
    }

    public void add(T element) {
        list.add(element);
        behaviorSubject.onNext(list);
    }
}


private void main() {
    final List<Integer> list = new ArrayList<>();
    list.add(0);
    list.add(1);

    final ObservableList<Integer> olist = new ObservableList<>(list);

    olist.getObservable().subscribe(System.out::println);

    olist.add(2);
    olist.add(3);
}
Run Code Online (Sandbox Code Playgroud)

在实现 MVP 时,当您想要观察系统中的一个组件(即:一个存储库或数据源)返回的一种资源(即:一组对象),并且您想要观察者(即:Presenter 或Interactor)在将元素添加到系统另一部分的列表时收到通知。