我目前正在为个人项目实施一小部分RxJava2的API。我有一个基于监听器的API,我开始编写代码来包装我的监听器并实现Flowable.create()
:
public class EventBus {
private final Flowable<Event> events;
public EventBus(MyApi api) {
this.events = Flowable.create(emitter -> {
Callback listener = new Callback() {
@Override
public void onEvent(Event event) {
emitter.onNext(event);
}
};
api.addListener(listener);
// TODO api.removeListener(listener)
}, BackpressureStrategy.BUFFER);
}
}.
我运行了一个快速测试,它运行得很好,但我意识到它是单线程。没什么大不了的:除非指定Scheduler
,否则RxJava的设计实际上是单线程的。
根据RxJava2的文档,我决定链接一个Flowable.subscribeOn()
调用,我将使用Scheduler.computation()
参数调用。
所以我继续实施Flowable.subscribeOn()
和Scheduler.computation()
,这就是我试图解决的问题:我已经在各个地方看到了Java&#39 ; s ForkJoinPool.commonPool()
建议运行计算任务,但RxJava2不使用它。我的主要问题是:
谢谢!
答案 0 :(得分:2)
这是否适合我的基本反应性实施?
将补丁写入传统的回调api有点常见,假设还没有写过。
为什么RxJava2选择实现自己的池而不是使用这个?
RxJava始终针对Java 6及更高版本而ForkJoinPool
是Java 7.请注意,commonPool
有时会在调用者线程上执行工作,并且不会异步。由于同一个池死锁,我们在CI服务器上挂了很多单元测试。
实现一小部分RxJava2的API 我应该注意这种方法有什么问题,让我的生活更轻松吗?
你是什么意思?您是尝试重新实现RxJava 2,库,还是在您的代码中使用和应用现有运算符?
如果是后者,除了commonPool
的警告之外,它取决于你想要与之交互的内容。