我正致力于将听众包装到Observables中。通常我们使用Observable.create()
来包装它,但有些库更喜欢使用自定义Observable并在其中包装内容,例如RxBinding
,甚至RxJava本身(根据我的理解,operators
是基本上创建新的Custom Observable以在其中进行操作。)
所以我的问题是:
我们可以从Custom Observable获得什么好处?它的开销比Observable.create()
低,因为我们不会为我们生成另一个ObservableCreate
来覆盖ObservableSource
。
我应该将现有的图书馆包装成Rx样式(例如:Firebase)?
答案 0 :(得分:5)
在某些情况下,创建自定义Observable可以提供更多的爱好者。
在RxJava 1.x中,扩展403 Forbidden
和使用Observable
没有任何好处,因为它们实际上是相同的。但是,为中间运算符创建Observable.create(OnSubscribe)
比为自定义Observable
使用lift()
更有好处。 Operator
会增加额外保护措施的开销,因为人们往往首先找到Observable.create(Emitter, BackpressureStrategy)
,并在实现create
之前just()
,range()
或from()
重新实现Observable
。不必要的。
在RxJava 2.x中,默认方式是扩展create()
和其他类型以添加源/中间运算符,这是可能的最低开销。受保护的创建方法仍然存在,但是对理解协议有一些小的投入,通过让Observer
或Disposable
也实现接口,可以避免因final class ActionEventObservable extends Observable<ActionEvent> {
final AbstractButton widget;
ActionEventObservable(AbstractButton widget) {
this.widget = widget;
}
@Override
protected void subscribeActual(Observer<? super ActionEvent> observer) {
AbstractButton w = widget;
ActionEventConsumer aec = new ActionEventConsumer(observer, w);
observer.onSubscribe(aec);
w.addActionListener(aec);
if (aec.get() == null) {
w.removeActionListener(aec);
}
}
static final class ActionEventConsumer
extends AbstractEventConsumer<ActionEvent, AbstractButton>
implements ActionListener {
private static final long serialVersionUID = -3605206827474016488L;
ActionEventConsumer(Observer<? super ActionEvent> actual, AbstractButton widget) {
super(actual, widget);
}
@Override
public void actionPerformed(ActionEvent e) {
actual.onNext(e);
}
@Override
protected void onDispose(AbstractButton component) {
component.removeActionListener(this);
}
}
}
而分配额外的对象或扩展目标外部技术的基类。
例如,这就是我为Java Swing和RxJava 2编写适配器库的方法:
AbstractEventConsumer
某些一次性管理隐藏在一个公共Listener
类中,并且各个事件处理程序通常必须实现所需的config/initializers/wicked_pdf.rb
并在dispose上调用相应的remove方法。
另外,大多数流行的技术可能已经有了可以使用的RxJava适配器。
答案 1 :(得分:0)
我会尽可能使用库提供的创建方法,例如:generate
,fromCallable
或create
。它们没有任何开销。他们负责处理各种内务管理问题,在编写自定义可观察对象时很容易忘记这些问题。
不幸的是,有些情况下您无法使用它们,例如。什么时候需要特殊安排。在编写自定义observable之前,我建议您查看generate
或create
库方法的源代码。确保你理解它的每一点,所以你可以在你的观察中做类似的事情。