android rxjava repeating a request(Android rxjava重复请求)
本文介绍了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重复请求的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
沃梦达教程
本文标题为:Android rxjava重复请求
基础教程推荐
猜你喜欢
- UIWebView 委托方法 shouldStartLoadWithRequest:在 WKWebView 中等效? 2022-01-01
- Kivy Buildozer 无法构建 apk,命令失败:./distribute.sh -m “kivy"d 2022-01-01
- 在 gmail 中为 ios 应用程序检索朋友的朋友 2022-01-01
- 如何在 iPhone 上显示来自 API 的 HTML 文本? 2022-01-01
- Android:对话框关闭而不调用关闭 2022-01-01
- 如何让对象对 Cocos2D 中的触摸做出反应? 2022-01-01
- android 应用程序已发布,但在 google play 中找不到 2022-01-01
- 如何在没有IB的情况下将2个按钮添加到右侧的UINavigationbar? 2022-01-01
- 如何在 UIImageView 中异步加载图像? 2022-01-01
- 当从同一个组件调用时,两个 IBAction 触发的顺序是什么? 2022-01-01