Advertisement
Guest User

Untitled

a guest
Dec 6th, 2016
66
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.52 KB | None | 0 0
  1. /**
  2. * Executes long running tasks not faster then once in [delayMillis] and makes sure
  3. * at most one tasks executes at a time (the task itself may take more than [delayMillis]
  4. * to complete.
  5. */
  6. class DebouncingQueue(
  7. private val delayMillis: Int,
  8. parentDisposable: Disposable
  9. ) {
  10. private val alarm = Alarm(Alarm.ThreadToUse.POOLED_THREAD, parentDisposable)
  11. private var pendingTask: ((CompletionToken) -> Unit)? = null
  12. private var inFlightTask: CompletionToken? = null
  13.  
  14. fun submit(task: (CompletionToken) -> Unit, immediately: Boolean) = onAlarmThread {
  15. alarm.cancelAllRequests()
  16. if (immediately) {
  17. schedule(task)
  18. } else {
  19. alarm.addRequest({ schedule(task) }, delayMillis)
  20. }
  21. }
  22.  
  23. inner class CompletionToken() {
  24. fun taskCompleted() = onAlarmThread {
  25. LOG.assertTrue(inFlightTask == this)
  26. inFlightTask = null
  27.  
  28. val task = pendingTask
  29. if (task != null) {
  30. pendingTask = null
  31. execute(task)
  32. }
  33. }
  34. }
  35.  
  36. private fun onAlarmThread(work: () -> Unit) = alarm.addRequest(work, 0)
  37.  
  38. private fun schedule(task: (CompletionToken) -> Unit) {
  39. if (inFlightTask == null) {
  40. execute(task)
  41. } else {
  42. pendingTask = task
  43. }
  44. }
  45.  
  46. private fun execute(task: (CompletionToken) -> Unit) {
  47. LOG.assertTrue(inFlightTask == null)
  48. val token = CompletionToken()
  49. inFlightTask = token
  50. task(token)
  51. }
  52. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement