android rxjava重复请求

Rop*_*oks 1 android rx-java

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

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

yos*_*riz 6

实际上,您没有放置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)