Android 将特定 API 调用限制为 3 秒内一次

Pet*_*der 5 android retrofit2 rx-java2

我想限制/testAPI 调用每 3 秒调用一次,例如:

2021-09-21 14:09:19.920 V/OkHttp: --> GET https://xxx/test
2021-09-21 14:09:20.031 V/OkHttp: <-- 200 https://xxx/test (109ms)
2021-09-21 14:09:20.038 V/OkHttp: --> GET https://xxx/test
2021-09-21 14:09:20.136 V/OkHttp: <-- 200 https://xxx/test (96ms)
2021-09-21 14:09:20.146 V/OkHttp: --> GET https://xxx/test
2021-09-21 14:09:20.315 V/OkHttp: <-- 200 https://xxx/test (168ms)
2021-09-21 14:09:20.325 V/OkHttp: --> GET https://xxx/test
2021-09-21 14:09:20.499 V/OkHttp: <-- 200 https://xxx/test (172ms)
2021-09-21 14:09:20.514 V/OkHttp: --> GET https://xxx/test
2021-09-21 14:09:20.615 V/OkHttp: <-- 200 https://xxx/test (100ms)
2021-09-21 14:09:20.628 V/OkHttp: --> GET https://xxx/test
2021-09-21 14:09:20.721 V/OkHttp: <-- 200 https://xxx/test (91ms)
2021-09-21 14:09:20.734 V/OkHttp: --> GET https://xxx/test
2021-09-21 14:09:20.827 V/OkHttp: <-- 200 https://xxx/test (87ms)
Run Code Online (Sandbox Code Playgroud)

将被调用一次:

2021-09-21 14:09:19.920 V/OkHttp: --> GET https://xxx/test
2021-09-21 14:09:20.031 V/OkHttp: <-- 200 https://xxx/test (109ms)
Run Code Online (Sandbox Code Playgroud)

出于测试目的,我正在做:

repeat(10) { index ->
    apiRepo.test() //Returns Single
        .toObservable()
        .debounce(3, TimeUnit.SECONDS)
        .subscribe({}, { Timber.e(it) })
    }
Run Code Online (Sandbox Code Playgroud)

我来自 Coroutine 世界,所以我认为我误解了它的debounce工作原理,因为我仍然收到 10 个调用(2 秒内),而我预计 3 秒内有 1 个调用。

luk*_*jar 5

你创造了新的debounce十次。这就是为什么它没有按预期工作的原因。要实现您想要的效果,您可以使用PublishSubject

val apiCallSubject = PublishSubject.create<Unit>()

apiCallSubject
    .debounce(3, TimeUnit.SECONDS)
    .flatMapSingle { apiRepo.test() }
    .subscribe({}, { Timber.e(it) })

repeat(10) { apiCallSubject.onNext(Unit) }
Run Code Online (Sandbox Code Playgroud)

关键是您反跳的 Observable 必须发出多个项目。在你的情况下,它只发射一次但十次。