使用rxjava2设置改造api调用的延迟

时间:2018-03-07 16:41:41

标签: android kotlin rx-java2

我正在尝试将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完成。

3 个答案:

答案 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->

            }
}