Android rxjava重复请求 [英] android rxjava repeating a request

查看:50
本文介绍了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个间隔重复操作,您应该使用名为repeatWhenrepeat运算符变量,您可以这样提供您的间隔逻辑:

.repeatWhen(completed -> completed.delay(5, TimeUnit.SECONDS))
repeatWhen()将向您提交将源ObservableonCompleted()事件转换为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重复请求的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆