技术小黑屋

Coobox之 LastWinExecutor,后来居上执行器

在编程的业务场景中,有时候会有这样的情况。有一个文本输入框用来输入检索数据

  • 为了避免过多的网络检索,实现频率控制
  • 当且仅当距离上次输入字符500 毫秒后,才真正执行检索请求

第一步 创建 LastWinExecutor

1
val lastWinExecutor: LastWinExecutor = LastWinExecutor(500)

其中

  • LastWinExecutor 接受一个超时参数,单位为毫秒,例子中为500毫秒

第二步 提交请求

1
2
3
4
lastWinExecutor.submit {
  //需要执行的代码
  ...
}

其中

  • 每次输入框内容改变都会调用lastWinExecutor.submit
  • 但是仅仅当距离上个输入框字符输入超过500 毫秒 才执行相应的代码

完整代码

1
2
3
4
5
6
7
8
9
10
11
class LastWinExecutorFragment : TestableFragment() {
    val lastWinExecutor: LastWinExecutor = LastWinExecutor(500)

    fun observeTextView(textView: TextView) {
        textView.doAfterTextChanged {
            lastWinExecutor.submit {
                queryResult(it?.toString())
            }
        }
    }
}

实现原理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/**
 * 任务执行器,在规定的时间内执行提交,最后一个会被执行,之前的会被取消
 */
class LastWinExecutor(private val timeSpanInMills: Long) {
    private val handler = Handler(Looper.getMainLooper())

    /**
     * 提交一个任务,如果在提交后 @param timeSpanInMills 没有新任务, 则执行该任务,否则被取消
     */
    fun submit(task: KRunnable) {
        clearAllTasks()
        handler.postDelayed(task, timeSpanInMills)
    }

    /**
     * 取消所有任务
     */
    fun clearAllTasks() {
        handler.removeCallbacksAndMessages(null)
    }
}

实现原理为利用了 Handler postDelay方法实现。

如何快速使用





快来解锁最新版 Typora,新用户券后仅需 84 元!
如何便宜的购买 office 365 ?
新版赤友 NTFS 助手来袭,正版超低价