Имея функцию updateData(id:String, data: Any?)
, которая будет обновлять некоторые данные относительно id
. Хотел бы обновить только последние данные, если этот вызов для одного и того же id
слишком рано один за другим, предыдущий следует отбросить.
private var _lastId = ""
private var _lastCallJob: Job? = null
private fun debouncingUpdateData(id: String, data: Any?) {
if (_lastId == id) {
_lastCallJob?.cancel()
_lastCallJob = launch {
delay(20)
updateData(id, data)
}
} else {
_lastId = id
_lastCallJob = launch {
delay(20)
updateData(id, data)
}
}
}
эта реализация отменит ранее запущенный _lastCallJob
(незавершенный, скорее всего, все еще ждет 20 миллисекунд), только если идентификатор тот же.
Но это не работает для случая типа id="1", id="2", id="3"
поэтому при вызове типа:
debouncingUpdateData("1", data)
debouncingUpdateData("2", data)
debouncingUpdateData("1", data)
3-й вызов для id==="1" все еще может выйти (даже если 1-й все еще находится в диапазоне задержки 20 миллисекунд), так как _lastId
было изменено на "2".
есть ли лучший способ сделать устранение дребезга с помощью сопрограмм?
debounce
? kotlin.github.io/kotlinx. сопрограммы/kotlinx-coroutines-ядро/ - person fraggjkee   schedule 13.05.2020asFlow
. Последним шагом будет добавление методаdebounce
к этому потоку и просто наблюдение за его выбросами и реагирование по мере необходимости (загрузка данных и т. д.). Очень похоже на то, что я сделал бы с Rx —Subject
+debounce
, но с использованием Coroutines & Flow. - person fraggjkee   schedule 13.05.2020