java - 从普通 Java 事件创建 Observable

标签 java events event-handling rx-java

从经典 Java 事件模式创建 Rx-Java Observable 的最佳方法是什么?也就是说,给定

class FooEvent { ... }

interface FooListener {
  void fooHappened(FooEvent arg);
}

class Bar {
  public void addFooListener(FooListener l);
  public void removeFooListener(FooListener l);
}

我要实现

Observable<FooEvent> fooEvents(Bar bar);

我想出的实现是:

Observable<FooEvent> fooEvents(Bar bar) {
  return Observable.create(new OnSubscribeFunc<FooEvent>() {
    public Subscription onSubscribe(Observer<? super FooEvent> obs) {
      FooListener l = new FooListener() {
        public void fooHappened(FooEvent arg) {
          obs.onNext(arg);
        }
      };

      bar.addFooListener(l);

      return new Subscription() {
        public void unsubscribe() {
          bar.removeFooListener(l);
        }
      };
    }
  }); 
}

不过,我不是很喜欢:

  1. 很冗长;

  2. 每个 Observer 都需要一个监听器(理想情况下,如果没有观察者,则应该没有监听器,否则只有一个监听器)。这可以通过将观察者计数保留为 OnSubscribeFunc 中的一个字段,在订阅时递增,在取消订阅时递减。

有没有更好的解决方案?

要求:

  1. 使用现有的事件模式实现而不更改它们(如果我正在控制该代码,我已经可以编写它以返回我需要的 Observable)。

  2. 如果/当源 API 更改时会出现编译器错误。不能使用 Object 而不是实际的事件参数类型或属性名称字符串。

最佳答案

我认为没有办法为每个可能的事件创建一个通用的 observable,但您当然可以在任何需要的地方使用它们。

RxJava 源代码有一些方便的示例,说明如何从鼠标事件、按钮事件等创建可观察对象。看看这个类,它从 KeyEvents 创建它们:KeyEventSource.java .

关于java - 从普通 Java 事件创建 Observable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20552598/

相关文章:

java - 如何设置我的 textview 以显示 json 数组中的所有元素

java - 在 GWT 中关闭窗口时执行代码

c++ - 检查命名事件

c# - 未注册的事件处理程序导致内存泄漏

java - 将事件/回调绑定(bind)到 Java 中的关键字

c# - 如何处理添加到列表事件?

java - 如何使用泛型指定与 Comparable 类型的父类(super class)关系

java - 如何在 Jetty 中启用 SSL 调试?

java - 鼠标监听器洪水保护仅报告第一次点击

php - 在 Facebook 上创建事件