美文网首页
Android使用Kotlin实现防抖行为

Android使用Kotlin实现防抖行为

作者: 烧伤的火柴 | 来源:发表于2021-02-22 14:15 被阅读0次

    简介

    今天我们要实现一个功能,批量上传,当用户完成某个动作后就记录下操作数据,然后延迟2秒上传,当2秒内有新的上传任务的时候,就取消上个任务,重新开始计时延时上传,这个行为和Js的防抖功能一样,那么Kotlin如何实现呢?

    知道高阶函数的我们可以使用高阶函数和闭包来实现,不知道的请自行学习。

    实现

    /**
     * 消抖行为
     *
     */
    fun debounceSuspend(delayMs: Long = 500L, coroutineScope: CoroutineScope, f: suspend CoroutineScope.() -> Unit): () -> Unit {
        var job: Job? = null
        return {
            job?.cancel()
            job = coroutineScope.launch {
                delay(delayMs)
                job = null
                f()
            }
        }
    }
    
    /**
     * 主线程的消抖行为
     */
    fun <T> debounceOnMainThread(delayMs: Long = 500L, callback: (T) -> Unit): (T) -> Unit {
        val handle = Handler(Looper.getMainLooper())
        var runnable: Runnable? = null
        return {t->
            runnable?.let {
                handle.removeCallbacks(it)
            }
            runnable = Runnable {
                callback(t)
            }
            handle.postDelayed(runnable, delayMs)
        }
    }
    

    可以看到,异步和主线程的防抖实现都是返回一个匿名函数,外部每次调用匿名函数的时候,都会先取消上次的行为,然后延迟一段时间,执行任务。
    调用方式如下

    private val debounceWifiChanged = debounceOnMainThread<Boolean>(5000) {
            onWifiConnectedChange(it)
        }
    

    当高层监听到变化都调用一次debounceWifiChanged函数。

    相关文章

      网友评论

          本文标题:Android使用Kotlin实现防抖行为

          本文链接:https://www.haomeiwen.com/subject/geohfltx.html