2016-07-28 7 views
3

Immediate schedulerを使用する場合と使用しない場合の違いは何ですか?即時スケジューラとスケジューラをまったく使用しない場合の相違

Observable.create(subscriber -> subscriber.onNext(new Object())).subscribeOn(Schedulers.immediate()).subscribe(); 
//vs 
Observable.create(subscriber -> subscriber.onNext(new Object())).subscribe(); 

即時スケジューラがSleepingActionを使用し、即座にそれを実行します:

this.schedule(new SleepingAction(action, this, execTime)); 

しかし、それは実際にはすぐにではないようで、可能な遅延があります:

long delay = this.execTime - this.innerScheduler.now(); 
Thread.sleep(delay); 

だから私はとの権利という違いですImmediate schedulerを使用し、スケジューラをまったく使用しないことは可能な遅延ですか?

答えて

1

しかし、この遅延オプションが

Schedulers.immediate()は、依存性注入とObservableのsynchrounous変種を提供するために使用される可能性がありますSchedulers.immediate()が便利にす​​るものではありませんが正しいです。

public class ServiceObservable { 

    private final Scheduler subscribeOnScheduler; 
    private final Scheduler observeOnScheduler; 

    public ServiceObservable(Scheduler subscribeOnScheduler, Scheduler observeOnScheduler) { 
     this.subscribeOnScheduler = subscribeOnScheduler; 
     this.observeOnScheduler = observeOnScheduler; 
    } 

    public Observable<ServiceData> getServiceDataObservable() { 
     return serviceDataObservable 
       .observeOn(observeOnScheduler) 
       .subscribeOn(subscribeOnScheduler); 
    } 
} 

あなたは、このような生産コードでこのオブジェクトを作成する必要があります:

ServiceObservable serviceObservable = new ServiceObservable(Schedulers.io(), AndroidSchedulers.mainThread());

と、このようなテスト

ServiceObservable serviceObservable = new ServiceObservable(Schedulers.immediate(), Schedulers.immediate());

+2

それはこのようなクラスを持つ例えば 単体テストのために 'Schedulers.trampoline()'を使うのが良いです。すぐにブロッキングスリープが発生するため、2.xから完全に削除する予定です。出典:https://github.com/ReactiveX/RxJava/wiki/What's-different-in-2.0-(draft) – LordRaydenMK

+1

'trampoline()'もブロッキングスリープを使用しますが、 'immediate'よりも利点は、再帰的にスケジュールできることですそれと。 –

関連する問題