如何使用 RxJava 的正确调度器观察 UI 事件?

How to observe UI events with the correct Scheduler with RxJava?

假设我在任何类型的现代 UI 框架中都有一个通用的 'Button'(我现在正在使用 Android,但问题几乎与平台无关).我可以在这个按钮上放一个监听器来监听点击事件。我的侦听器收到有关 UI 线程上的单击事件的通知。从反应的角度来看,这是一个问题,更具体地说,是在线程的上下文中。

我可以轻松地为点击事件创建一个主题。观察者很可能想在另一个线程上进行处理。但是我不能轻易地从 .observeOn() 操作员中提取(没有黑客攻击或丑陋的解决方法)Scheduler 的 Worker,以便将事件分派给正确的 Worker。

如何从这些点击事件中创建 Observable 流,以便该流符合 .observeOn() 操作员的调度要求?

我不清楚这里到底是什么问题。 ObserveOn 将事件放入指定的调度程序,在幕后可能会针对不同的订阅者在不同的线程上结束。如果你想确保每个订阅者都能在同一个线程上接收到事件,你需要有一个只有一个支持线程的调度器。获得此类调度程序的最简单方法是包装一个 ExecutorService:

Scheduler s = Schedulers.from(Executors.newSingleThreadedExecutor());

PublishSubject<Event> ps = PublishSubject.create();

Observable<Event> events = ps.observeOn(s);

events.subscribe(...);
events.subscribe(...);

ps.onNext(...);