Оператор Интервал

У меня есть сетевой звонок, и я хочу звонить ему периодически. Я хотел использовать только оператор Interval с flatMap, но в потоке interval. Вы можете объяснить эту ситуацию. Я знаю, что Interval использует только один поток и задачи обрабатываются последовательно.

У меня initDelay = 0, interval = 10. Вызов первого сетевого вызова занимает 12 единиц времени и после них сразу же вызывается следующий запрос. Почему не вызывается через 12 + 10 единиц времени? Я думаю, что этот ключ находится в классе PeriodicTask. Похоже, что вызывается сетевой вызов (DecoratedRun) и после них вызывается новое планирование. Но это мое предположение не соответствует действительности. Метод Decorated.run () запускается в рабочем потоке и планирует после них в основном?

Потому что Interval выдает элементы с фиксированным интервалом. Даже если действие выдачи элемента занимает больше, чем запрошенный интервал, это не должно влиять на поведение оператора.

M. Prokhorov 16.03.2018 17:26
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
1
62
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Если вы хотите выполнить сетевой вызов с 10 единицами времени от конца предыдущего вызова до начала следующего вызова, вы можете сделать что-то вроде этого:

Observable.fromCallable( () -> makeNetworkCall() )
  .take( 1 )
  .repeatWhen( notification -> notification.delay( 10, timeunits, scheduler )
  .subscribe( ... );

Это вызовет сетевой вызов, передаст результирующее значение, а затем повторно подпишется на наблюдаемое через 10 единиц времени.

Мне не нужно искать другого решения. Вы прочитали мой вопрос?

elnino 18.03.2018 00:12

Почему вы использовали дубль?

elnino 18.03.2018 10:06

Я предоставил вам способ получить 10 единиц времени между вызовами сети. Observable.interval() предоставляет значения с 10 единицами времени между каждым значением, что явно не то, что вы хотели.

Bob Dalgleish 19.03.2018 17:22

Оператор take() принимает первое выданное значение и затем завершает цепочку наблюдателя. Это заставляет оператора repeatWhen() применить свою наблюдаемую к наблюдаемой завершению, задерживаясь на 10 временных единиц, а затем повторно подписавшись на наблюдаемую.

Bob Dalgleish 19.03.2018 21:39

Другие вопросы по теме