android rxjava repeating a request(Android rxjava重复请求)
问题描述
我正在努力实现以下目标。我加载了要获取值的对象列表,以便稍后将其放入列表中。
首先,我使用平面映射将所有值收集到一个数组中(按山的顺序),然后在完成所有操作后,我填充一个适配器。
我无法做到的是每隔xxx秒重复一次该操作。我知道它是用间歇来完成的。我仍然没有得到任何结果,或者重复一个结果只得到一个结果。
以下是我的代码:
Observable.fromIterable(URLList)
.concatMap(url -> standartRequest(App.getInstance().getApi().getService().getData(currency.getUrl())))
.retry(Constants.RETRY_COUNT)
.timeout(Constants.TIMEOUT_IN_SECONDS, TimeUnit.SECONDS)
.observeOn(AndroidSchedulers.mainThread())
.subscribe(this::success, this::error, this::valuesRetrieved);
recyclerView = ((CurrencyListFragment) controller).getRecyclerView();
LinearLayoutManager linearManager = new LinearLayoutManager(controller.getContext());
recyclerView.setLayoutManager(linearManager);
}
private void valuesRetrieved() {
listAdapter adapter = new listAdapter(valuesFromResponse);
recyclerView.setAdapter(adapter);
}
private void success(Object response) {
valuesFromResponse.add(response);
}
我该放在哪里
.interval(5, TimeUnit.SECONDS).timeInterval()
推荐答案
实际上,您没有将interval
放在任何地方,对于每个x个间隔重复操作,您应该使用名为repeatWhen
的repeat
运算符变量,您可以这样提供您的间隔逻辑:
.repeatWhen(completed -> completed.delay(5, TimeUnit.SECONDS))
repeatWhen()
将向您提交将源Observable
onCompleted()
事件转换为onNext()
(带有void)的Observable
,您应该返回发出要重新订阅到源的信号的Observable
-这意味着重复该操作。repeatWhen()
将向您提交Observable
将源事件转换为onNext()
(带有void)的Observable
事件,您应该返回发出要重新订阅到您的源的信号的Observable
,这意味着重复该操作。而onCompleted()/onError()
将作为onCompleted()/onError()
在您的源Observable
上交付。
recommended reading关于repeatWhen/retryWhen
。
需要考虑的一件事是,repeatWhen()
基本上会吞噬您的所有onCompleted
事件(因为您正在重复没有onCompleted()
的操作,您的Observable
不会自行停止!),那么您应该以不同的方式收集和更新适配器,我想您可以简单地使用toList()
将所有项目收集到单个onNext()
(替换success()
逻辑),然后在每个onNext
上更新列表(您现在正在onCompleted
上做的事情),总结如下:
Observable.fromIterable(URLList)
.concatMap(url -> standartRequest(App.getInstance().getApi().getService().getData(currency.getUrl())))
.retry(Constants.RETRY_COUNT)
.timeout(Constants.TIMEOUT_IN_SECONDS, TimeUnit.SECONDS)
.toList()
.repeatWhen(completed -> completed.delay(5, TimeUnit.SECONDS))
.observeOn(AndroidSchedulers.mainThread())
.subscribe(this::valuesRetrieved, this::error);
编辑:
您的超时和重试逻辑应用于整个操作链,因此如果所有网络请求加起来超过Constants.TIMEOUT_IN_SECONDS
,您将得到超时异常,您可能只想重试并超时每个单独的请求。如下所示:
Observable.fromIterable(URLList)
.concatMap(url -> standartRequest(App.getInstance()
.getApi().getService().getData(currency.getUrl())
.retry(Constants.RETRY_COUNT)
.timeout(Constants.TIMEOUT_IN_SECONDS, TimeUnit.SECONDS)))
.toList()
.repeatWhen(completed -> completed.delay(5, TimeUnit.SECONDS))
.observeOn(AndroidSchedulers.mainThread())
.subscribe(this::valuesRetrieved, this::error);
这篇关于Android rxjava重复请求的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!