Возвращаемое значение Single emitter Rx Java - PullRequest
0 голосов
/ 09 мая 2020

Как мне вернуть значение из одиночного наблюдаемого в Rx Java

fun fetchRunResult() : Single<Boolean>{
   return Single.just(false)
}

fun canRun() : Boolean {
   return person.fetchRunResult() // get boolean instead of Single
}

1 Ответ

1 голос
/ 09 мая 2020

Преобразование между реактивным и нереактивным миром осуществляется с помощью: блокировки вызовов или подписки

Зачем использовать реактивный?

  • compose asyn c event -streams без обратного вызова-hell
  • проектирует систему как потоки

Преобразование реактивного типа в нереактивный тип: блокирование

fun canRun() : Boolean {
    return person.fetchRunResult().blockingGet()
}

С помощью этого метода вы можете просто заблокировать вызывающий поток, пока значение не станет доступным.

В чем проблема с блокировкой вызывающего потока?

  • значение может никогда не поступить, поэтому один поток заблокирован навсегда
  • , если заблокированный поток - это ui-l oop, ваш пользовательский интерфейс будет заморожен, потому что поток ожидает заблокированного на CountDownLatch (деталь реализации)

Должен ли я преобразовывать между реактивным и неактивным -Реактивный тип?

Я бы посоветовал использовать его только с осторожностью. Либо вы знаете, что источником является syn c, либо теперь вы знаете, что значение уже доступно. Поэтому #blockingGet не будет блокировать вызывающий поток

Каковы альтернативы, когда источник является асинхронным c?

Смоделируйте свой поток и используйте #subscribe внутри контейнер с жизненным циклом. Например, Activity предоставляет методы жизненного цикла. При использовании подписки поток вызова / подписки не будет заблокирован. Вы будете получать обратный вызов каждый раз, когда будет доступно новое значение. Единственное, на что следует обратить внимание, - это очистить ваши ресурсы, как в Disposable, потому что невыполнение этого может привести к утечкам с реактивными типами.

Резюме:

  • если ваши данные асинхронные c, ваш API должен отражать это и не переключаться между реактивными <-> нереактивными
  • , не используйте blockingGet, вероятно, потому что это может привести к потоку, который заблокирован навсегда
...