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




Если вы хотите выполнить сетевой вызов с 10 единицами времени от конца предыдущего вызова до начала следующего вызова, вы можете сделать что-то вроде этого:
Observable.fromCallable( () -> makeNetworkCall() )
.take( 1 )
.repeatWhen( notification -> notification.delay( 10, timeunits, scheduler )
.subscribe( ... );
Это вызовет сетевой вызов, передаст результирующее значение, а затем повторно подпишется на наблюдаемое через 10 единиц времени.
Мне не нужно искать другого решения. Вы прочитали мой вопрос?
Почему вы использовали дубль?
Я предоставил вам способ получить 10 единиц времени между вызовами сети. Observable.interval() предоставляет значения с 10 единицами времени между каждым значением, что явно не то, что вы хотели.
Оператор take() принимает первое выданное значение и затем завершает цепочку наблюдателя. Это заставляет оператора repeatWhen() применить свою наблюдаемую к наблюдаемой завершению, задерживаясь на 10 временных единиц, а затем повторно подписавшись на наблюдаемую.
Потому что
Intervalвыдает элементы с фиксированным интервалом. Даже если действие выдачи элемента занимает больше, чем запрошенный интервал, это не должно влиять на поведение оператора.