Hot observables are a type of observables where the observer would be able to multicast the message simultaneously to all its subscribers at once rather than creating one stream for each subscriber. Let me elaborate that a little bit. Usually, when you have an Observable
, a subscriber subscribing to this observer will initiate the subscription and consume every message until the complete event is sent out. Every other subscriber will start the consumption from the start again.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
List<Integer> integerList = IntStream.range(1, 11).boxed().collect(Collectors.toList()); | |
Observable<Integer> integerObservable = Observable.fromIterable(integerList) | |
.map(integer -> integer * 2); | |
Disposable subscribe1 = integerObservable | |
.map(integer -> integer * 10) | |
.subscribe(integer -> System.out.println("From first subscriber: "+integer)); | |
Disposable subscribe2 = integerObservable | |
.map(integer -> integer * 100) | |
.subscribe(integer -> System.out.println("From second subscriber: "+integer)); |
The output of the above code would be:
From first subscriber: 20 From first subscriber: 40 From first subscriber: 60 From first subscriber: 80 From first subscriber: 100 From first subscriber: 120 From first subscriber: 140 From first subscriber: 160 From first subscriber: 180 From first subscriber: 200 From second subscriber: 200 From second subscriber: 400 From second subscriber: 600 From second subscriber: 800 From second subscriber: 1000 From second subscriber: 1200 From second subscriber: 1400 From second subscriber: 1600 From second subscriber: 1800 From second subscriber: 2000
When you have more than one Observer
, the default behavior is to create a separate stream for each one. We do not want this behavior always. Hot Observables
are used to solve this. If there is a scenario where we want to share Observables
, RxJava
has a specific way to achieve this. Let’s see how that is done.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// Define your publisher | |
ConnectableObservable<Integer> integerObservable = Observable.fromIterable(integerList) | |
.map(integer -> integer * 2) | |
.publish(); | |
// Define your subscribers | |
Disposable subscribe1 = integerObservable | |
.map(integer -> integer * 10) | |
.subscribe(integer -> System.out.println("From first subscriber: " + integer)); | |
Disposable subscribe2 = integerObservable | |
.map(integer -> integer * 100) | |
.subscribe(integer -> System.out.println("From second subscriber: " + integer)); | |
//Start publishing simultaneously | |
integerObservable.connect(); |
The above example is how you define a hot obsevervable. ConnectableObservable
is a special type of Observable
that would send events to all its subscribers simultaneously. All you need to do is to define your publisher by calling publish()
method. Then define your subscribers normally as you would do with a normal Observable
. Once you define your subscribers, you need to call the connect()
method on the ConnectableObserver
to start publishing the message simultaneously to all the subscribers.
Let’s see the output of the above code snippet:
From first subscriber: 20 From second subscriber: 200 From first subscriber: 40 From second subscriber: 400 From first subscriber: 60 From second subscriber: 600 From first subscriber: 80 From second subscriber: 800 From first subscriber: 100 From second subscriber: 1000 From first subscriber: 120 From second subscriber: 1200 From first subscriber: 140 From second subscriber: 1400 From first subscriber: 160 From second subscriber: 1600 From first subscriber: 180 From second subscriber: 1800 From first subscriber: 200 From second subscriber: 2000
ConnectableObservable will force emissions from the source to become hot, pushing a single stream of emissions to all Observers at the same time rather than giving a separate stream to each Observer.