Главное различие между Hot и Cold Observables заключается в моменте начала генерации данных и поведении при множественных подписках.
Observable<String> cold = Observable.create(emitter -> {
System.out.println("Генерация данных");
emitter.onNext("Данные 1");
emitter.onNext("Данные 2");
emitter.onComplete();
});
// Первая подписка
cold.subscribe(data -> System.out.println("Подписчик 1: " + data));
// Вторая подписка (данные генерируются заново)
cold.subscribe(data -> System.out.println("Подписчик 2: " + data));
Характеристики:
Observable.just(), Observable.fromCallable(), Observable.create()PublishSubject<String> hot = PublishSubject.create();
// Источник данных
new Thread(() -> {
hot.onNext("Данные 1");
hot.onNext("Данные 2");
}).start();
// Первая подписка (может пропустить часть данных)
hot.subscribe(data -> System.out.println("Подписчик 1: " + data));
// Вторая подписка (получает только новые данные)
Thread.sleep(100);
hot.subscribe(data -> System.out.println("Подписчик 2: " + data));
Характеристики:
Subject, ConnectableObservable, Observable.interval()| Критерий | Cold Observable | Hot Observable |
|---|---|---|
| Генерация данных | При каждой подписке | Независимо от подписок |
| Данные | Полный набор для каждого | Только новые данные |
| Аналог | CD-плеер | Радиостанция |
| Поток данных | Пассивный (по запросу) | Активный (постоянный) |
| Примеры | just(), fromIterable() | Subject, ConnectableObservable |
Используем операторы для конвертации:
Observable<String> cold = Observable.just("A", "B", "C");
// 1. Через publish() + connect()
ConnectableObservable<String> hot1 = cold.publish();
hot1.connect();
// 2. Через share() (автоматическое подключение)
Observable<String> hot2 = cold.share();
// 3. Через Subject
PublishSubject<String> subject = PublishSubject.create();
cold.subscribe(subject);
Cold подходит для:
Hot подходит для: