2014-01-21 74 views

回答

60

一個主題是ObservableObserver在同一時間,它可以像正常觀測值一樣取消訂閱。使學科特別的是它是可觀察者和觀察者之間的橋樑。它可以通過重新發送它們來通過它觀察到的項目,並且它還可以發出新的項目。如果對未來承諾的話,對象應該是可觀察的。

這裏是主題系列的簡短描述:

AsyncSubject:只發射源可觀察

BehaviorSubject的最後一個值:發射最近發射的項目,所有的後續項目源觀察者訂閱它時可觀察

發佈主題:發出源Observable的所有後續項目在訂閱時

ReplaySubject:發出源Observable的所有項目,而不管訂戶何時訂閱。

official doc提供了一些好的大理石圖這使得它更容易理解

+2

BehaviorSubject與ReplaySubject(1)基本相同嗎? –

+1

@DzmitryLazerka:BehaviorSubject始終有一個初始值。如果您正在查找沒有初始值的BehaviorSubject,則使用ReplaySubject(1)。 – gregschlom

+0

雖然稍作修改很好的回答--ReplaySubject也可以在create()中指定緩衝區,這將是訂閱時發出的項目數量 – jklp

21

主題基本上是觀測量和觀察員。

可觀察到的基本上是有一個函數,觀察員和返回訂閱的事情。因此,例如,給出簡單的觀察到:

Observable<Integer> observable = Observable.create(new Observable.OnSubscribeFunc<Integer>() { 
     @Override 
     public Subscription onSubscribe(Observer<? super Integer> observer) { 
      observer.onNext(3); 
      observer.onNext(2); 
      observer.onNext(1); 
      observer.onCompleted(); 

      return Subscriptions.empty(); 
     } 
    }); 

在這裏,我們將訂閱它,打印出一條線的各整數:通過調用sub.unsubscribe()

Subscription sub = observable.subscribe(new Action1<Integer>() { 
     @Override 
     public void call(Integer integer) { 
      System.out.println(integer); 
     } 
    }); 

您將取消上述。

這裏是一個PublishSubject,做大致相同的事情:通過調用subscription.unsubscribe()

PublishSubject<Integer> publishSubject = PublishSubject.create(); 
    Subscription subscription = publishSubject.subscribe(new Action1<Integer>() { 
     @Override 
     public void call(Integer integer) { 
      System.out.println(integer); 
     } 
    }); 

    publishSubject.onNext(3); 
    publishSubject.onNext(2); 
    publishSubject.onNext(1); 

你會退訂用同樣的方式。

+0

請問您能介紹一下我們如何讓訂戶在並行處理onNext?如果有幾個訂閱者,而不僅僅是一個,我們如何讓它們並行執行 – vach

+2

@vach - 根據上面的代碼,您可以通過執行類似下面的操作,使訂閱者在onNext上並行處理: 'Subscription subscription1 = publishSubject.observeOn(Schedulers .newThread())。subscribe(...);' and 'Subscription subscription2 = publishSubject.observeOn(Schedulers.newThread())。subscribe(...);' –

+0

我總是想知道如何做到這一點,我直到現在還沒有明白,thx @ praveer09 :) –

4

所有Subjects延長Observable您可以訂閱使用任何倍數subscribe(...)方法。呼籲任何subscribe(...)方法返回一個Subscription

Subscription subscription = anySubject.subscribe(...); 

使用,當你想停止收聽來自受試者的事件,此subscription實例的unsubscribe()方法。

subscription.unsubscribe();