2017-04-27 52 views
1

我正在将听众包装到Observables中。通常我们使用Observable.create()来包装,但有些图书馆更喜欢使用自定义Observable,并在其中包含东西,如RxBinding,甚至RxJava本身(从我的理解,operators基本上创建新的Custom Observable来执行其内部操作) 。CustomObservable vs Observable.create()?

所以我的问题是: 我们可以从Custom Observable中获得什么好处?它只比Observable.create()低,因为我们不会为我们生成另一个ObservableCreate来覆盖ObservableSource

我应该用什么来将现有库封装到Rx Style(例如:Firebase)?

+0

相关:http://stackoverflow.com/a/41870888/697313 –

+0

@YaroslavStavnichiy不完全是。其实我想知道为什么libs如'RxBinding'使用自定义Observable而不是'Observable.create' –

+1

库最大化代码重用,有他们的内部架构/哲学。如果你编写一个包含许多包装接口的库,你可能会投入时间开发和测试一些biolerplate基类,这比使用通用的'create'更适合于扩展。 –

回答

4

在某些情况下,创建自定义Observable会为情人节省开销。

在RxJava 1.x中,扩展Observable和使用Observable.create(OnSubscribe)没有任何好处,因为它们实际上是相同的。但是,为中间运营商创建Observable的益处要比使用lift()自定义Operator的好处。 Observable.create(Emitter, BackpressureStrategy)增加额外安全开销,因为人们倾向于首先发现create,并在实现之前先实际上重新实现just()range()from()

在RxJava 2.x中,默认方法是扩展Observable,其他类型添加源/中间运算符,这是最低的开销。保护的创建方法仍然存在,但在理解协议时只需一些小的投资,通过使ObserverDisposable也实现接口或扩展目标外部技术的基类,可以避免分配额外的对象,这是由于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适配器可以使用。

0

只要有可能,我会使用库提供的创建方法,如:generate,fromCallablecreate。他们没有任何开销。他们处理各种家务问题,在编写自定义可观察数据时可以轻松忘记这些问题。

不幸的是有些情况下,你不能使用它们,例如。当你需要特殊的时间安排。在编写自定义可观察数据之前,我建议查看generatecreate库方法的源代码。确保你了解它的每一点,所以你可以在你的可观察对象中做类似的事情。

相关问题