Я пытаюсь создать приложение для удаленного управления роботом (во всяком случае, это не имеет значения), и я столкнулся с проблемой, что серверная часть (на роботе) настолько слаба, чтобы обрабатывать все http запросы со смартфона. Но все же я могу отправить один запрос за 100-150 мс. Я использую Rx Java и модифицирую для отправки всех запросов;
Я пытаюсь спросить, могу ли я планировать ВСЕ запросы и отправлять их с постоянным интервалом?
В моем приложении есть basePresenter, который отправляет «любой» запрос на сервер и проверяет, подключен он или нет (и делает это с некоторым интервалом):
requestInterface.checkConnectionToRobot()
.doOnError(err -> {err.printStackTrace(); action(false);})
.retryWhen(o -> o.delay(2000, TimeUnit.MILLISECONDS))
.repeatWhen(o -> o.delay(2000, TimeUnit.MILLISECONDS))
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.doOnNext(next -> action(true))
.subscribe(new DisposingObserver<ResponseBody>() {
@Override
public void onSubscribe(final Disposable d) {
addContinuous(d);
}
});
Как вы могли понять, эта проверка должна повторяться бесконечно. Проблема возникает, когда я пытаюсь сделать еще один такой запрос (например, для проверки некоторой информации от датчиков робота и т. Д.):
requestInterface.refreshBaseData()
.retryWhen(o -> o.delay(1000, TimeUnit.MILLISECONDS))
.repeatWhen(o -> o.delay(refreshRate, TimeUnit.MILLISECONDS))
.subscribeOn(Schedulers.io())
.map(RefreshDataConverter::convertData)
.observeOn(AndroidSchedulers.mainThread())
.doOnNext(next -> getViewState().setBaseData(next))
.subscribe(new DisposingObserver<RefreshData>() {
@Override
public void onSubscribe(final Disposable d) {
addContinuous(d);
baseCheckDisposable = d;
}
});
Запрос почти такой же, и он сам задерживается.
Но когда они работают оба, они могут перекрывать друг друга, и сервер может сломаться.
Я пробовал Observable.interval
и Schedulers.from(Executors.newSingleThreadExecutor())
Как этот:
scheduler = Schedulers.from(Executors.newSingleThreadExecutor())
Observable.interval(1, TimeUnit.SECONDS)
.flatMap(n ->
requestInterface.checkConnectionToRobot()
.subscribeOn(scheduler))
.doOnError(err -> {err.printStackTrace(); action(false);})
.retryWhen(o -> o.delay(2000, TimeUnit.MILLISECONDS))
.repeatWhen(o -> o.delay(2000, TimeUnit.MILLISECONDS))
.observeOn(AndroidSchedulers.mainThread())
.doOnNext(next -> action(true))
.subscribe(new DisposingObserver<ResponseBody>() {
@Override
public void onSubscribe(final Disposable d) {
addContinuous(d);
}
});
То же самое по другому запросу, но они все равно перекрывают друг друга.
Что я делаю неправильно? Мне просто нужно отправить все запросы из моего приложения с задержкой (может быть, мне нужен какой-то менеджер или что?).
Постскриптум любые исправления моего кода приветствуются. :)
Спасибо