Есть еще один интересный подход для достижения этой цели т.е. WatchDog . Эта концепция исходит из дизайна электроники и оборудования. (для получения дополнительной информации см. wikipedia )
Основная идея WatchDog заключается в том, что делегированная работа будет выполнена, если WatchDog не будет сброшен до назначенного времени.
Однако мы можем реализовать эту концепцию следующим образом:
TimerWatchDog.kt
import java.util.*
/**
* @author aminography
*/
class TimerWatchDog(private val timeout: Long) {
private var timer: Timer? = null
fun refresh(job: () -> Unit) {
timer?.cancel()
timer = Timer().also {
it.schedule(object : TimerTask() {
override fun run() = job.invoke()
}, timeout)
}
}
fun cancel() = timer?.cancel()
}
Использование:
class MyFragment : Fragment {
private val watchDog = TimerWatchDog(300)
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
button.setOnClickListener {
watchDog.refresh {
getPokemonDetailByName(name)
}
}
}
}
Таким образом, если пользователь нажимает кнопку безостановочно с интервалом менее 300 мс, getPokemonDetailByName(name)
не звонит. Таким образом, только последний щелчок вызывает функцию.
Это очень полезно также там, где у нас есть окно поиска, которое запускает запрос на основе текста, введенного пользователем. ( ig добавление TextWatcher
на EditText
) Это приводит к меньшему количеству вызовов api, когда пользователь набирает текст, что оптимизирует потребление ресурсов.