我正在尝试将Handler
替换为RxJava2
。我想让apiCall()
每隔800毫秒后端,但它不适用于delay
PRESENTER
val disposable = repository.apiCall(...)
.observeOn(AndroidSchedulers.mainThread())
.toObservable()
.throttleFirst(800, TimeUnit.MILLISECONDS)
.subscribe({ result ->
...
}, { _ ->
...
})
compositeDisposable.add(disposable)
REPO
fun apiCall(...): Single<ArrayList<Data>> {
return service.retrofitCall(...)
.onErrorResumeNext(...)
.map { result ->
...
return@map result
}
}
这提出了很多要求。感觉就像一个循环哈哈。我需要的是这个api呼叫发送请求的每800ms(如果是用户垃圾邮件点击按钮)
之情况
用户按下按钮并调用api请求。我想确保,如果用户垃圾邮件点击此按钮,则只有1个请求呼叫转到api,而不是100x。我认为这可以在过去使用debounce
完成。
答案 0 :(得分:1)
修改 :(更改实际问题)
拿一个stream of clicks,限制它并将API调用平面映射到它上面
fun setup() {
clicksDisposable = RxView.clicks(button)
.throttleFirst(800, TimeUnit.MILLISECONDS))
.flatMapSingle({ t ->
service.apiCall()
.onErrorResumeNext(...)
.map { result -> result }
})
.subscribe(/* ... */);
}
答案 1 :(得分:0)
看看.repeatWhen()
您可以使用类似
的内容fun apiCall(): Single<ArrayList<Data>> {
return service.apiCall()
.repeatWhen(completed -> completed.delay(800, MILLISECONDS)))
.onErrorResumeNext(...)
.map { result->
}
}
答案 2 :(得分:0)
如果要重复请求,则必须使用interval:
fun apiCall(): Single<ArrayList<Data>> {
return Observable.interval(800, 800, TimeUnit.MILLISECONDS)
.flatmap { service.apiCall() }
.onErrorResumeNext(...)
.map { result->
}
}