eleven
eleven

Reputation: 6847

Difference between using Immediate scheduler and not using schedulers at all

Whats the difference between using Immediate scheduler and not using?

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

Immediate scheduler uses SleepingAction and runs it instantly:

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

But it seems it's actually not immediate, there is possible delay:

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

So am I right that difference between using Immediate scheduler and not using schedulers at all is in possible delay?

Upvotes: 3

Views: 2699

Answers (1)

krp
krp

Reputation: 2247

That is correct however this delaying option is not what makes Schedulers.immediate() useful

Schedulers.immediate() might be used for providing synchrounous variants of Observable with dependency injection. For example having such class :

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

you may want to create this object in production code like this :

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

and in tests like this

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

Upvotes: 1

Related Questions