2016-07-28 7 views
3

Was ist der Unterschied zwischen Immediate scheduler verwenden und nicht verwenden?Unterschied zwischen der Verwendung von Immediate Scheduler und keine Verwendung von Scheduler überhaupt

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

Immediate Scheduler verwendet SleepingAction und führt es sofort:

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

Aber es scheint, es ist eigentlich nicht sofort, es ist möglich, Verzögerung:

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

So bin ich richtig, dass Unterschied zwischen mit Immediate scheduler und nicht mit Scheduler überhaupt ist in möglichen Verzögerung?

Antwort

1

Das ist richtig aber ist diese Verzögerung Option ist nicht das, was Schedulers.immediate macht() nützlich

Schedulers.immediate() könnte für die Bereitstellung von synchrounous Varianten von Observable mit Dependency Injection verwendet werden. Für solche Klasse Beispiel mit:

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); 
    } 
} 

Sie wie folgt diese Aufgabe in der Produktion Code erstellen möchten:

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

und in Tests wie dieser

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

+2

Es ist besser, 'Schedulers.trampoline()' für Komponententests zu verwenden. Aufgrund des Blockieren-Schlafes in Sofort gibt es einen Plan, es vollständig von 2.x fallen zu lassen. Quelle: https://github.com/ReactiveX/RxJava/wiki/What-different-in-2.0-(draft) – LordRaydenMK

+1

'trampoline()' verwendet auch blocking sleeps, aber sein Vorteil gegenüber 'sofort 'ist, dass Sie rekursiv planen können damit. –