当我们已经对某个按钮做了防暴力点击,但是依然在业务上有些复杂交互的情况,需要我们封装一个防重Toast。针对这类情况,可以直接使用下面的showDebouncedToast
data class ToastInfo(val id: Any? = null,val command: MediaCommandDebouncer.MediaCommand? = null,val toastInfoId: Int = 0,val showTime: Long = 0L
)private var mShownToastInfo = ToastInfo()
private const val TOAST_DEBOUNCE_TIME = 1000L //1s内不可弹出重复Toast 自定义/*** 防重Toast方法,用于无法使用防暴力点击的复杂场景* @param id 操作的内容的唯一标识* @param command 操作命令,可选* @param toastInfoId 字符串资源ID,-1代表网络异常,0代表无效值* @param msg 要显示的文本消息,优先使用这个参数*/
fun showDebouncedToast(id: Any? = null,command: Command? = null,toastInfoId: Int = 0,msg: String? = null
) {val currentTime = System.currentTimeMillis()// 防连弹检查if (mShownToastInfo.toastInfoId == toastInfoId &&mShownToastInfo.id == id &&mShownToastInfo.command == command) {val timeDifference = currentTime - mShownToastInfo.showTimeif (mShownToastInfo.showTime != 0L && timeDifference in 0..TOAST_DEBOUNCE_TIME) {Log.i(TAG, "Already show similar toast recently, skip: ${getToastMessage(toastInfoId, msg)}")return}}// 显示Toast 这里是自己封装的showToast,就不在这里展示了,直接使用makeText也可以when {msg != null -> showToast(msg)toastInfoId == -1 -> showSystemNoNetworkToast()toastInfoId != 0 -> showToast(toastInfoId)else -> Log.w("ToastManager", "Invalid toast parameters")}// 更新记录mShownToastInfo = ToastInfo(id, command, toastInfoId, currentTime)
}// 辅助方法,用于获取Toast消息(用于日志)
private fun getToastMessage(toastInfoId: Int, msg: String?): String {return msg?: if (toastInfoId == -1) {"Network error toast"} else if (toastInfoId != 0) {try {SkinManager.getInstance().getString(toastInfoId)} catch (e: Exception) {"Toast resource ID: $toastInfoId"}} else {"Unknown toast"}
}
比如说,当前我对某个内容的id执行了一个操作command,它需要弹出一个stringId为toastInfoId的文言,我需要预防短时间内同一个id弹出多个Toast的情况,就可以使用showDebouncedToast,调用方法:
//传R.string.xxxshowDebouncedToast(id, command, toastStringId)//传msgshowDebouncedToast(id, command, "some msg")