如何使用 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(...);
假设我在任何类型的现代 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(...);