在某些情况下,创建自定义Observable会为情人节省开销。
在RxJava 1.x中,扩展Observable
和使用Observable.create(OnSubscribe)
没有任何好处,因为它们实际上是相同的。但是,为中间运营商创建Observable
的益处要比使用lift()
自定义Operator
的好处。 Observable.create(Emitter, BackpressureStrategy)
增加额外安全开销,因为人们倾向于首先发现create
,并在实现之前先实际上重新实现just()
,range()
或from()
。
在RxJava 2.x中,默认方法是扩展Observable
,其他类型添加源/中间运算符,这是最低的开销。保护的创建方法仍然存在,但在理解协议时只需一些小的投资,通过使Observer
或Disposable
也实现接口或扩展目标外部技术的基类,可以避免分配额外的对象,这是由于create()
。
例如,这是我写的一个适配器库的Java Swing和RxJava 2:
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);
}
}
}
一些一次性的管理是隐藏在一个共同的AbstractEventConsumer
类和个别事件处理程序大多有来实现所需Listener
并在处置时调用相应的remove方法。
请注意,大多数流行的技术可能已经有RxJava适配器可以使用。
相关:http://stackoverflow.com/a/41870888/697313 –
@YaroslavStavnichiy不完全是。其实我想知道为什么libs如'RxBinding'使用自定义Observable而不是'Observable.create' –
库最大化代码重用,有他们的内部架构/哲学。如果你编写一个包含许多包装接口的库,你可能会投入时间开发和测试一些biolerplate基类,这比使用通用的'create'更适合于扩展。 –