我正在努力实现以下目标。我加载了一个对象列表,我想稍后将值放入列表中。
首先,我使用 flatmap 将所有值收集到一个数组中(按山顺序),然后当一切完成后,我填充一个适配器。
我无法做的就是每隔 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);
}
Run Code Online (Sandbox Code Playgroud)
我放在哪里
.interval(5, TimeUnit.SECONDS).timeInterval()
Run Code Online (Sandbox Code Playgroud)
实际上,您没有放置interval任何地方,为了每隔 x 间隔重复操作,您应该使用repeat称为操作符的变体repeatWhen,您可以通过这种方式提供间隔逻辑:
.repeatWhen(completed -> completed.delay(5, TimeUnit.SECONDS))
Run Code Online (Sandbox Code Playgroud)
repeatWhen()将交给您一个Observable将您的源Observable onCompleted()事件转换为onNext()(使用 void)的,您应该返回Observable它发出onNext()哪些信号以重新订阅您的源Observable- 意味着重复操作。虽然onCompleted()/onError()将根据onCompleted()/onError()您的来源交付Observable。
推荐阅读关于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);
Run Code Online (Sandbox Code Playgroud)
编辑:
您的超时和重试逻辑适用于整个操作链,因此如果所有网络请求加在一起超过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);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
10773 次 |
| 最近记录: |