2014-10-01 194 views
27

我需要一個Observable,例如提供一個系統時鐘,它不需要在onNext()中傳遞任何東西。我找不到可以讓我這樣做的簽名。Observable在onNext()中不傳遞任何東西()

當然,我可以使用任何對象,然後傳遞null,但這沒有多大意義。所以我的問題是如果有更好的方法來做到這一點。

Observable.create(new Observable.OnSubscribe<Anyobject>() { // use any object in the signature 

      @Override public void call(Subscriber<? super Anyobject> subscriber) { 

        subscriber.onNext(null); // then pass null 
        subscriber.onCompleted(); 

      } 

     }) 
+0

所以你只是想打電話給onNext()不帶任何參數? – 2014-10-01 17:09:13

+1

注意其他人來這裏,'onNext(null)'不好,儘管其他答案和評論說。請參閱[規範](https://github.com/reactive-streams/reactive-streams-jvm/blob/v1.0.0/README.md#2-subscriber-code)。另請參閱[此問題](https:// github。com/ReactiveX/RxJava/issues/4644)在RxJava中。 – 2016-11-09 00:21:23

回答

36

你並不需要,如果你的Observable不發出任何調用onNext。 你可以在你的簽名使用Void,並完成類似

Observable<Void> o = Observable.create(new Observable.OnSubscribe<Void>() { 
    @Override 
    public void call(Subscriber<? super Void> subscriber) { 
     // Do the work and call onCompleted when you done, 
     // no need to call onNext if you have nothing to emit 
     subscriber.onCompleted(); 
    } 
}); 

o.subscribe(new OnCompletedObserver<Void>() { 
    @Override 
    public void onCompleted() { 
     System.out.println("onCompleted"); 
    } 

    @Override 
    public void onError(Throwable e) { 
     System.out.println("onError " + e.getMessage()); 
    } 
}); 

您可以定義一個OnCompletedObserver簡化您的觀察器回調,這樣你就不必重寫onNext,因爲你不需要它。

public abstract class OnCompletedObserver<T> implements Observer<T> { 
    @Override 
    public void onNext(T o) { 

    } 
} 

如果我明白你在問什麼,那麼這應該可以做到。

+0

我希望我的Observable能發出一些東西,這是常規的tick,即使這個tick沒有任何別的東西(不需要傳遞一個對象)。使用Void的技巧很好,但我想我無法在onNext(void)中傳遞void,因爲Void無法實例化。儘管如此,我可以傳遞null,所以它可以很好地工作。謝謝! – 2014-10-01 19:02:24

+0

是的你是正確的,你可以簡單地在這種情況下使用'null'。 – 2014-10-01 19:40:44

+0

@MiguelLavigne你能否更新你的答案?我知道它工作正常,但考慮到最近的API更新(s)也許我們可以以不同但更優雅的方式實現它?謝謝! – beerBear 2016-10-31 03:52:52

31

如果你需要的東西onCompleted()之前要傳遞給onNext()被稱爲:

Observable.<Void>just(null) 

如果你只需要onCompleted()被稱爲:

Observable.empty() 
0

我不知道這將幫助您或不。
代碼寫在RxSwift

// Create an observable and emit somethings 
let myObservable = Observable<Void>.create{ observer in 
    observer.on(.next(Void())) 
    return Disposables.create() 
} 

// Observer subscribe changes 
myObservable.subscribe(onNext: { 
    _ in 
    print("Hello") 
}).disposed(by: disposeBag) 

或者使用可變對象

// Create a Variable object that contanins nothing 
var myValueWatcher:Variable<Void> = Variable<Void>(Void()) 

// Observer subscribe changes 
myValueWatcher.asObservable().skip(1).subscribe(onNext: { 
    _ in 
    print("Changes!") 
}).disposed(by: disposeBag) 


// The emit code 
myValueWatcher.value = Void() 
+0

您可以用()替換Void() – dduyduong 2018-01-07 17:45:02

1

RxJava 2 Wiki

RxJava 2.x的不再接受空值和下面將立即或作爲信號向下遊產生 的NullPointerException 。

...

這意味着Observable<Void>不再發出任何值,但僅 正常終止或異常。 API設計師可以 轉而選擇與什麼 對象將難保定義Observable<Object>(這應該是無關反正)

這意味着你不能使用VoidObservable.just(null)

使用Object或其他一些簡單的類型,而不是:

Observable.just(new Object());