RxJava 2 Disposable — Under the hood

Niklas Baudy
5 min readMar 18, 2017

Everyone has code like the following:

private CompositeDisposable compositeDisposable =
new CompositeDisposable();
@Override public void onCreate() {
compositeDisposable.add(backendApi.loadUser()
.subscribe(this::displayUser, this::handleError));
}
@Override public void onDestroy() {
compositeDisposable.clear();
}

A backend request is done and the Disposable returned from the subscribe() method is added to the list of CompositeDisposables. The moment the Activity will be destroyed, the list of Disposables gets cleared and we’re good.

What is this Disposable?

Disposable is an interface containing two methods.

public interface Disposable {
void dispose();
boolean isDisposed();
}

But how does this disposing mechanism work? To demonstrate what I mean, let’s look at this example:

TestScheduler scheduler = new TestScheduler();
TestObserver<Long> o = Observable.interval(1, SECONDS, scheduler)
.test();
o.assertNoValues();scheduler.advanceTimeBy(1, SECONDS);
o.assertValues(0L);
scheduler.advanceTimeBy(1, SECONDS);
o.assertValues(0L, 1L);
o.dispose(); // Dispose the connection.scheduler.advanceTimeBy(100, SECONDS);
o.assertValues(0L, 1L);

--

--