gpt4 book ai didi

android rxjava 重复请求

转载 作者:行者123 更新时间:2023-12-04 23:52:18 30 4
gpt4 key购买 nike

我正在努力实现以下目标。我加载了一个对象列表,我想获取稍后放入列表中的值。

首先,我使用 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);
}

我在哪里放
.interval(5, TimeUnit.SECONDS).timeInterval()

最佳答案

好吧,实际上,你没有把 interval在任何地方,要每隔 x 间隔重复一次操作,您应该使用 repeat称为 repeatWhen 的运算符变体您可以在其中以这种方式提供间隔逻辑:

.repeatWhen(completed -> completed.delay(5, TimeUnit.SECONDS))
repeatWhen()将交给您 Observable改变你的来源 Observable onCompleted()事件为 onNext() (带 void),您应该返回 Observable发出 onNext()哪些信号重新订阅您的来源 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 重复请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43294281/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com