Coobox 之 LastWinExecutor,后来居上执行器

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

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

第一步 创建 LastWinExecutor

val lastWinExecutor: LastWinExecutor = LastWinExecutor(500)

其中

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

第二步 提交请求

lastWinExecutor.submit {
    //需要执行的代码
    ...
}

其中

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

完整代码

class LastWinExecutorFragment : TestableFragment() {
    val lastWinExecutor: LastWinExecutor = LastWinExecutor(500)

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

实现原理

/**
 * 任务执行器,在规定的时间内执行提交,最后一个会被执行,之前的会被取消
 */
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方法实现。

如何快速使用

•LastWinExecutor 已经包含在 CooBox 中,简单几步即可集成。开始集成[1] 欢迎点星星•LastWinExecutor 源码 https://github.com/secoo-android/coobox
点击阅读原文,访问 Coobox,麻烦大家点个星星

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值