android - Android 将特定 API 调用限制为 3 秒内一次
问题描述
我想限制/test
API 调用在 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)
将被调用一次:
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)
出于测试目的,我正在做:
repeat(10) { index ->
apiRepo.test() //Returns Single
.toObservable()
.debounce(3, TimeUnit.SECONDS)
.subscribe({}, { Timber.e(it) })
}
我来自协程世界,所以我想我误解了它的debounce
工作原理,因为我仍然收到 10 个调用(在 2 秒内),而我预计 3 秒内会有 1 个调用。
解决方案
你创造一个新的debounce
十倍。这就是为什么它没有按预期工作的原因。要实现您想要的,您可以使用PublishSubject。
val apiCallSubject = PublishSubject.create<Unit>()
apiCallSubject
.debounce(3, TimeUnit.SECONDS)
.flatMapSingle { apiRepo.test() }
.subscribe({}, { Timber.e(it) })
repeat(10) { apiCallSubject.onNext(Unit) }
关键是你去抖动的 Observable 必须发射多个项目。在你的情况下,它只发出一但十次。
推荐阅读
- oracle-apex - 授权方案变更未反映在申请中
- tsql - 为什么在空列上使用 ORDER BY 的 TOP 1 结果集显示与 TOP 5 不同的结果?
- amazon-web-services - 通过 AMI 上的云形成模板设置用户数据的最佳实践是什么
- reactjs - 如何在reactjs中的材料表上呈现第二个请求的响应
- python-3.x - SAlib(敏感性分析)包是否只支持一列(向量)输入?
- angular - 从 mat-table 获取行 id 和输入值(角度)
- html - 汉堡菜单 100% 高度
- c# - Autofac:解析只有一个元素的列表失败
- templates - 通过 ReST 调用使用模板打开 GitHub 问题
- ruby-on-rails - gem rMagick 未在 ubuntu 18.04 上安装