Kotlin实现,重复点击请求交互
2018-05-15 本文已影响280人
PaulLuv
需求:
在业务请求时,需要处理重复点击引发的重复请求问题;
当请求响应时间过长时,需要弹出进度对话框,给用户一个好的提示。
这个需求对应用所有的可点击响应请求的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方法即可。
如果你有更优雅的实现方法,欢迎留言私信我,谢谢。