android rxjava重复请求

时间:2017-04-08 12:47:47

标签: 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);
}

我在哪里放

.interval(5, TimeUnit.SECONDS).timeInterval()

2 个答案:

答案 0 :(得分:1)

实际上,你没有把interval放在任何地方,为了每隔x个间隔重复一次操作,你应该使用名为repeat的{​​{1}}运算符变体,你可以在这里提供你的区间逻辑方式:

repeatWhen

.repeatWhen(completed -> completed.delay(5, TimeUnit.SECONDS)) 会将repeatWhen()转换为Observable Observable事件onCompleted()(无效),您将返回{{1}如果它发出onNext(),它将重新订阅您的来源Observable - 意味着重复操作。 onNext() Observable将在您的来源onCompleted()/onError()上以onCompleted()/onError()投放。 关于Observable的{​​{3}}。

要考虑的一件事,因为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

答案 1 :(得分:0)

我将在完成后每2秒钟重复一次改造电话

//Retrofit Builder
        val retrofitBuilder = Retrofit.Builder()
            .addConverterFactory(GsonConverterFactory.create())
            .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
            .baseUrl("http://worldtimeapi.org/")
            .build()

        val timeApi = retrofitBuilder.create(TimeApi::class.java)


    val timeObservable = timeApi.getTime()

    timeObservable.subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .repeatWhen { completed -> completed.delay(2, TimeUnit.SECONDS) }
        .subscribe(object : Observer<Time> {
            override fun onComplete() {
                Log.e("MainActivity", "It is completed")
            }

            override fun onSubscribe(d: Disposable) {
                Log.e("MainActivity", "you have successfully subscribed ")
            }

            override fun onNext(t: Time) {
                progress.visibility = View.INVISIBLE
                txtTime.text = t.unixtime
                Log.e("MainActivity", "OnNext Called" + t.unixtime)

            }

            override fun onError(e: Throwable) {
                Log.e("MainActivity", "ERROR")
            }
        })

}

请参阅“日志猫”,每2秒调用一次onNext。 enter image description here