在某些情況下,創建自定義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'更適合於擴展。 –