我正在尝试创建一个用于远程控制机器人的应用程序(无论如何,它并不重要),我遇到了一个问题,服务器端(在机器人上)太弱了处理来自智能手机的所有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);
}
});
在另一个请求中也是如此,但它们仍相互重叠。 我究竟做错了什么?我只需要延迟发送我的应用程序的所有请求(也许我需要某种经理或什么?)。 附:我的代码的任何更正都是受欢迎的。:) 感谢