我需要在一个不断变化的数组上创建一个Observer(添加元素)。
我正在使用Obserable.from(Iterable),但它似乎在创建时就像ArrayList一样创建了Observable。
每次ArrayList获取新元素时,我都需要通知Observer并执行Action。
答案 0 :(得分:34)
你去吧。感谢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);
}
}
答案 1 :(得分:5)
我会考虑基于BehaviourSubject的这种方法。 这与juanpavergara的解决方案的不同之处在于,当订阅Observable时,onNext()将立即发送到Observer。
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);
}
当您想要观察系统中一个组件(即:一个存储库或DataSource)返回的一个资源(即:一个对象列表)时,此解决方案在实现MVP时可能很有用,并且您需要Observer(即:将元素添加到系统其他部分的列表时通知:Presenter或Interactor。
答案 2 :(得分:3)
您可以将两个observable合并为一个。 其中一个可以是元素的初始列表,第二个可以是主题:
import rx.Observable;
import rx.subjects.ReplaySubject;
import java.util.ArrayList;
import java.util.List;
public class ExampleObservableList {
public static void main(String[] args) {
List<Integer> initialNumbers = new ArrayList<Integer>();
initialNumbers.add(1);
initialNumbers.add(2);
Observable<Integer> observableInitial = Observable.from(initialNumbers);
ReplaySubject<Integer> subject = ReplaySubject.create();
Observable<Integer> source = Observable.merge(observableInitial, subject);
source.subscribe(System.out::println);
for (int i = 0; i < 100; ++i) {
subject.onNext(i);
}
}
}
如果您没有初始元素,则只能使用ReplaySubject
(或其他Subject
- &gt;请参阅http://reactivex.io/documentation/subject.html):
public static void main(String[] args) {
ReplaySubject<Integer> source = ReplaySubject.create();
source.subscribe(System.out::println);
for (int i = 0; i < 100; ++i) {
source.onNext(i);
}
}
答案 3 :(得分:1)
嗨,您可以使用ObservableRxList在addAll上进行观察,添加,删除和更新列表
public class ObservableRxList<T> {
protected final List<T> list;
protected final PublishSubject<List<T>> subject;
public ObservableRxList() {
this.list = new ArrayList<T>();
this.subject = PublishSubject.create();
}
public void add(T value) {
list.add(value);
subject.onNext(list);
}
public void addAll(List<T> value) {
list.addAll(value);
subject.onNext(list);
}
//not sure about this
public void update(T value) {
for (ListIterator<T> it = list.listIterator(); it.hasNext(); ) {
if (value == it.next()) {
it.set(value);
break;
}
}
subject.onNext(list);
}
public void update(int position, T value) {
list.set(position, value);
subject.onNext(list);
}
public void remove(T value) {
list.remove(value);
subject.onNext(list);
}
public void remove(int index) {
list.remove(index);
subject.onNext(list);
}
public Observable<List<T>> getObservable() {
return subject;
}
public List<T> getCurrentList() {
return list;
}
}
用法: 每次使用addAll时,添加,删除或更新此观察器都会触发整个更新列表
mObservableRxList.getObservable().subscribe(productList-> {
this.products.clear();
this.products.addAll(productList;
productAdapter.notifyDataSetChanged();
});