Интервал для всех запросов Http (с использованием модернизации и Rx Java 2) - PullRequest
0 голосов
/ 16 мая 2018

Я пытаюсь создать приложение для удаленного управления роботом (во всяком случае, это не имеет значения), и я столкнулся с проблемой, что серверная часть (на роботе) настолько слаба, чтобы обрабатывать все 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);
                    }
                });

То же самое по другому запросу, но они все равно перекрывают друг друга. Что я делаю неправильно? Мне просто нужно отправить все запросы из моего приложения с задержкой (может быть, мне нужен какой-то менеджер или что?). Постскриптум любые исправления моего кода приветствуются. :) Спасибо

...