2017-04-27 49 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庫方法的源代碼。確保你瞭解它的每一點,所以你可以在你的可觀察對象中做類似的事情。

相關問題