Главное различие между 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 подходит для: