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

需求:

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

这个需求对应用所有的可点击响应请求的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实现,重复点击请求交互)