2017-01-23 18 views
2

我有一個事件回調方法如何將事件放入ReactiveX Observable?

public void onSomethingHappened(Information info) { 

其通過一些常規事件發行者調用。

現在我希望將其包含到ReactiveX observable中。

如何做到這一點?

UPDATE

我發現PublishSubject<T>類,並用這種以下列方式從Android API包LocationListener

public class LocationPublisher implements LocationListener { 


    @Override 
    public void onLocationChanged(Location location) { 
     LocationPublisher.onNext(location); 
    } 

    @Override 
    public void onStatusChanged(String provider, int status, Bundle extras) { 
     StatusPublisher.onNext(new BundleEx(provider, status, extras)); 
    } 

    @Override 
    public void onProviderEnabled(String provider) { 
     EnablenessPublisher.onNext(new Enableness(provider, true)); 
    } 

    @Override 
    public void onProviderDisabled(String provider) { 
     EnablenessPublisher.onNext(new Enableness(provider, false)); 
    } 

    public final PublishSubject<Location> LocationPublisher = PublishSubject.create(); 

    public final PublishSubject<BundleEx> StatusPublisher = PublishSubject.create(); 

    public final PublishSubject<Enableness> EnablenessPublisher = PublishSubject.create(); 


    public static class Enableness { 

     private final String provider; 

     private final boolean enabled; 


     public Enableness(String provider, boolean enabled) { 
      this.provider = provider; 
      this.enabled = enabled; 
     } 

     public String getProvider() { 
      return provider; 
     } 

     public boolean isEnabled() { 
      return enabled; 
     } 
    } 


    public static class BundleEx { 

     private final String provider; 

     private final int status; 

     private final Bundle extras; 

     public BundleEx(String provider, int status, Bundle extras) { 
      this.provider = provider; 
      this.status = status; 
      this.extras = extras; 
     } 

     public String getProvider() { 
      return provider; 
     } 

     public int getStatus() { 
      return status; 
     } 

     public Bundle getExtras() { 
      return extras; 
     } 
    } 
} 

這是正確的做法?現在我可以訂閱LocationPublisherStatusPublisherEnablenessPublisher我嗎?

+0

您基本上可以訂閱任何實現Observable的對象...所以是的,您可以訂閱LocationPublisher中的所有PublishSubjects對象。如果這是一個好方法?這很難說...對我來說很好。 –

+0

問題是任何人都可以將價值推向暴露的主題,而RxJava顯然沒有r/o主題的概念。 – Dims

+0

什麼是r/o主題? –

回答

0

你會認爲這些事件的來源是概念可觀察的,而監聽者是概念上的用戶。

最大的不匹配是你有一個無限的事件來源,即它不會自行終止。並不是說這是非法或不可能處理的,但對於RX來說並不自然。

所以你使用Observable.create()。 OnSubscribe是將偵聽器添加到此常規源的操作,同時實現了一個調用訂閱者onNext()的偵聽器。

//最後的EventSource源= ...

Observable.create(s -> { 
    source.addFooBarListener(info -> { //could be a full anon innerclass too if more than 1 method 
    s.onNext(info); 
    }); 
}); 

我去了記憶,我沒有手頭上有一個編譯器和的API。抱歉。 當然,執行正確的onComplete()/ onError()時有缺失的代碼行。