我正在努力实现以下目标。我加载了一个我想要获取值的对象列表,以便稍后放入列表中。
首先,我使用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()
答案 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")
}
})
}