【问题标题】:Using RxJava to observe List "add" and "remove" actions使用 RxJava 观察列表“添加”和“删除”操作
【发布时间】:2020-01-17 00:33:42
【问题描述】:

我想知道是否可以使用 RxJava 来获取 List(更具体地说,是 ArrayList)的更新。 我想要的是让 n 个订阅者在列表添加或删除项目时获得更新。我需要知道操作是什么,而不仅仅是被修改的项目。

我试过搜索这个,但到目前为止我找到的最接近的是这个answer

不过,这里只涉及“添加”功能,不涉及“删除”...

当一个项目被添加到列表时调用一个函数onAdd(Item item),然后在它被删除时调用另一个函数onRemove(Item item)

如果这不是使用 RxJava 的正确方法,请告诉我,我正在学习并接受各种帮助/批评 :)

谢谢, 岛

【问题讨论】:

  • 不能自己修改一下,根据add的做法创建remove吗?
  • 当然!我虽然这样做,但我需要订阅两个 Observables ......这是一个好的解决方案吗?因为我是在 Android 上做的,所以在寻找更好的方法时,我最终使用了本地广播。

标签: java android list rx-java add


【解决方案1】:

有几种方法可以做到这一点。一种方法是添加第二个 observable,这应该很容易。第二种选择是每次有通知时传递操作。

例如(使用 lombok 生成构造函数、getter 等):

public class ObservableListExample {

    @NoArgsConstructor
    public static class ObservableList<T> {

        protected final List<T> list = new ArrayList<T>();
        protected final PublishSubject<Notification<T>> onChange = PublishSubject.create();

        public void add(T value) {
            list.add(value);
            onChange.onNext(new Notification<T>(Operation.ADD, value));
        }

        public void remove(T value) {
            list.remove(value);
            onChange.onNext(new Notification<T>(Operation.REMOVE, value));
        }

        public Observable<Notification<T>> getObservable() {
            return onChange;
        }
    }

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

        olist.getObservable().subscribe(n -> System.out.println("op: " + n.getOperation() + " i: " + n.getItem()));

        olist.add(1);
        Thread.sleep(1000);
        olist.add(2);
        Thread.sleep(1000);
        olist.add(3);
        Thread.sleep(1000);
        olist.remove(2);
    }

    public static enum Operation {
        ADD,
        REMOVE
    }

    @Getter
    @AllArgsConstructor
    public static class Notification<T> {
        private Operation operation;
        private T Item;
    }
}

输出:

op: ADD i: 1
op: ADD i: 2
op: ADD i: 3
op: REMOVE i: 2

【讨论】:

  • 谢谢,我会记住这个解决方案 :D 但是,我想我可能会选择 akarnokd 的解决方案,因为它对我来说看起来更干净一些。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-06-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多