Hot and cold Observables
When creating an Interval Observable, I thought it will start ticking (emitting) immediately after creation. Wrong! There are hot and cold Observables. Hot Observables start firing events immediately. Cold Observables, only when there is at least one subscriber. Interval is cold – you have to connect an Observer first.
Docs and marble diagrams are the best source of information about transforming Observables.
Pure streams and side effects
When you connect an Observer to an Observable, every item emitted by the source is passed to the
onNext Observer method. There are no restrictions on what you can put in the
onNext handler. On the other hand, there are do callbacks, which can act similarly to
What’s the best practice? Implement
onNext handlers as pure functions. Actions with side-effects go into
In my pet project,
TimeSlice class creates a tick stream transformed previously with pure functions.
Main class adds impure console and Growl notifications to the stream in
do callbacks. In this way I can unit test the Observable produced by the
TimeSlice class using the provided
TestScheduler (more on this in the next section).
Want to be a master of time? Test your Observables with
TestScheduler. You will be able to advance time and gather all items produced by the Observable under test. Check the
TimeSliceTest class for usage examples.
Backpressure is a way to deal with an Observable that produces items too rapidly (or too slowly).
In my case I wanted to pause the interval Observable and resume its activity. I didn’t find a direct way (i.e. through any of RxJava interfaces), so I asked on Stack Overflow. The solution consists in filtering the Observable by a boolean “semaphore” toggled from outside.