美文网首页
Kotlin实现,重复点击请求交互

Kotlin实现,重复点击请求交互

作者: PaulLuv | 来源:发表于2018-05-15 09:30 被阅读280次

需求:

在业务请求时,需要处理重复点击引发的重复请求问题;
当请求响应时间过长时,需要弹出进度对话框,给用户一个好的提示。

这个需求对应用所有的可点击响应请求的View都需要实现,那肯定是封装一个Helper类来统一处理了。实现如下:

/*
 * 业务请求 UI 交互辅助类
 * 在业务请求时帮助处理 triggerView 的 可点击属性设置,
 * 进度对话框的延迟弹出.
 */
class RequestHelper(private val triggerView:View) {

    private var graceTimer:CountDownTimer? = null
    private var timeoutTimer:CountDownTimer? = null
    private var progressDialog:ProgressDialog? = null

    /**
     * 请求开始时调用,用以延迟显示进度对话框.
     * graceTimeMills 延迟时间,默认 1s, 即业务请求在 1s 内完成了,就不需要显示进度对话框.
     */
    fun onBegin(graceTimeMillis:Long = 1000){
        triggerView.isClickable = false
        triggerView.isEnabled = false
        graceTimer?.cancel()
        graceTimer = object :CountDownTimer(graceTimeMillis,graceTimeMillis){
            override fun onFinish() {
                val activity = triggerView.context.findAppCompatActivity()
                if (activity != null && !activity.isDestroyed && !activity.isFinishing){
                    Log.i("showLowRequestProgress trigger:$triggerView")
                    progressDialog = ProgressDialog(activity)
                    progressDialog?.show()
                }else{
                    Log.e("activity already destroyed")
                }
            }

            override fun onTick(p0: Long) {
                // ignore
            }
        }
        graceTimer?.start()

        // 5s 之后主动关闭, 业务的请求超时为 5s
        timeoutTimer = object :CountDownTimer(5000 + graceTimeMillis,1000L){
            override fun onFinish() {
                Log.w("call onEnd when timeout")
                onEnd()
            }

            override fun onTick(millisUntilFinished: Long) {
            }
        }
        timeoutTimer?.start()
    }

    /**
     * 请求结束时调用
     */
    fun onEnd(){
        graceTimer?.cancel()
        timeoutTimer?.cancel()
        graceTimer = null
        timeoutTimer = null
        progressDialog?.dismiss()
        progressDialog = null
        if (Looper.getMainLooper().thread == Thread.currentThread()){
            triggerView.isClickable = true
            triggerView.isEnabled = true
        }
    }

    //According to Java's rules, finalize() must not be private.
    protected fun finalize(){
        onEnd()
    }

}

调用的时候也很简单,请求开始前调用helper的onBegin方法,请求结束后调用onEnd方法即可。

如果你有更优雅的实现方法,欢迎留言私信我,谢谢。

相关文章

  • Kotlin实现,重复点击请求交互

    需求: 在业务请求时,需要处理重复点击引发的重复请求问题;当请求响应时间过长时,需要弹出进度对话框,给用户一个好的...

  • 20170504 RunTime

    iOS---防止UIButton重复点击的三种实现方式 iOS防止Button重复点击 iOS网络请求缓冲优化Ht...

  • 点击事件重复请求

    引子 当我们针对某个按钮绑定点击事件后,就可以随时通过点击鼠标来触发按钮的点击事件,如: 这样num值会不断增加,...

  • Android kotlin 点击事件防重复

    利用kotlin的拓展函数和拓展属性轻而易举实现点击事件防重复:新建一个kt文件,复制以下代码: 使用方法:

  • Android(Kotlin) 防止重复点击

    onClick点击事件: 使用方式: RecyclerView的onItemClickListener事件: 使用...

  • 重复点击,请求事件问题

    1.axios 原理,请求响应拦截重复请求 https://mp.weixin.qq.com/s/GtHBgzQ5...

  • 使用 Kotlin 实现 Y 组合子(Y-Combinator)

    使用 Kotlin 实现 Y 组合子(Y-Combinator) 《Kotlin极简教程》正式上架: 点击这里 >...

  • Promise解决实际问题

    1、取消重复请求 场景:一般点击了A按钮,请求已经发送,请求还没完的时候,再次点击按钮,又会发送新的请求。此场景,...

  • 「React Native」防重复点击

    一、防快速重复点击。 点击按钮后,立马将按钮设置为不可点击,按钮置灰,1.5秒后,重新可以点击。二、防网络请求重复...

  • 多线程实现按钮连续点击

    在日常测试中,按钮的连续点击可能会造成应用的奔溃,或者重复提交请求,对此我研究了下如何实现按钮的快速连续点击思路如...

网友评论

      本文标题:Kotlin实现,重复点击请求交互

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