subject.blockingLast(0)
означает следующее: получить последнее значение после того, как поток завершил передачу значений, и, если он завершился, не выдав ничего, вернуть значение по умолчанию.
Это означает, что blockingLast
будет ждать, пока не получит событие onComplete
, потому что только тогда он сможет выяснить, что поток завершился (и выдать последнее значение).PublishSubject
создает бесконечный поток , и вы никогда не вызовете batteryLevelSubject.onComplete
, чтобы завершить поток вручную, и поэтому он зависает навсегда.
Вы можете легко это исправить, изменив PublishSubject
на BehaviorSubject
.Основное различие между ними заключается в том, что BehaviorSubject
кэширует последнее полученное значение, которое затем может быть получено кем угодно.Кроме того, вам нужно изменить batteryLevelSubject.blockingLast(0)
на batteryLevelSubject.value
, чтобы получить последнее кэшированное значение (и оно ничего не заблокирует!).Но имейте в виду, что значение может быть нулевым при первом запуске, когда вы еще ничего не положили.Вы можете легко это исправить, создав BehaviorSubject
со значением по умолчанию, например:
val subject = BehaviorSubject.createDefault(0)